wake-up-neo.com

EF Core 2.0, wie man gespeicherte SQL-Prozeduren verwendet

Ich bin neu in EF Core 2.0 mit gespeicherter Prozedur.

Kann jemand helfen, wie gespeicherte Prozeduren in meinem EF Core 2.0-Code-First-Ansatz verwendet werden?

Bei meinem vorherigen Projekt hatte ich ein .edmx Modelldatei, und ich habe den folgenden Kontext verwendet:

public IEnumerable<UserResult> GetUserResults(Entities context)
{
    if (context == null) return new List<UserResult>();
    return context.spGetUsers().Where(u => u.IsDeleted == false);
}

und der Kontext ist:

public virtual ObjectResult<UserResult> spGetUsers()
{
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<UserResult>("spGetUsers");
}

Vielen Dank

9
Mukil Deepthi

Sie können die FromSQL-Methode verwenden:

var blogs = context.Blogs
    .FromSql("EXECUTE dbo.GetMostPopularBlogs")
    .ToList();

https://docs.Microsoft.com/en-us/ef/core/querying/raw-sql

10
ErikEJ

Um jemand anderem eine Stunde oder so zu sparen ...

Die Antwort von ErikEJ funktioniert einwandfrei, aber ich musste zuerst einige zusätzliche Arbeiten erledigen.

Nach einer Umkehrcode-Erstmigration (in eine vorhandene Datenbank mit gespeicherten Prozeduren) hatte ich ein Problem, bei dem die gespeicherten Prozeduren in einer vorhandenen Datenbank nicht die Standardtabelle (z. B. Liste von Blog), sondern eine andere Klasse zurückgaben (zB Liste von BlogTitleAndSummary) die sich nicht in der Datenbank befanden (und daher die Migration).

In diesem Beitrag heißt es, dass die Rückgabe muss ein Entitätstyp sein , bei der ich mir nicht sicher war, aber eine andere von Eriks Beiträgen mich in die richtige Richtung wies.

Um dieses Szenario zum Laufen zu bringen:

Ich habe eine Klasse von 'BlogTitleAndSummary' erstellt, die eine Eigenschaft als [key] Markiert.

z.B.

public class BlogTitleAndSummary
{
    [Key]
    public int BlogId { get; set; }

    public string Title { get; set; }

    public string ShortSummary { get; set; }
}

Dann habe ich es als DbSet im Kontext hinzugefügt, z.

public partial class BloggingContext : DbContext
{
    public BloggingContext()
    {
    }

    public BloggingContext(DbContextOptions<BloggingContext> options)
        : base(options)
    {
    }

    // Might be best to move these to another partial class, so they don't get removed in any updates.
    public virtual DbSet<BlogTitleAndSummary> BlogTitleAndSummary { get; set; }

    // Standard Tables
    public virtual DbSet<Blog> Blog { get; set; }
    ...
}

Dadurch konnte ich die folgende Syntax zum Aufrufen gespeicherter Prozeduren verwenden:

HINWEIS: Ich habe dies gemäß dem folgenden Kommentar aktualisiert. Verwenden Sie die Parameter in der FromSql-Methode. Verwenden Sie keine Zeichenfolgeninterpolation für solche SQL-Abfragen .

using (var ctx = new BloggingContext())
{
var dbResults = ctx.BlogTitleAndSummary.FromSql("EXEC dbo.get_bloggingSummary @UserId={0}", userId).ToList();
}
5
HockeyJ