web-dev-qa-db-fra.com

EF Core 2.0 comment utiliser la procédure stockée SQL

Je suis nouveau sur EF Core 2.0 avec une procédure stockée.

Quelqu'un peut-il m'aider à utiliser la procédure stockée dans mon approche de code EF Core 2.0 en premier?

Avec mon projet précédent, j'avais un .edmx fichier modèle, et j'utilisais le contexte comme ci-dessous:

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

et le contexte est:

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

Merci

9
Mukil Deepthi

Vous pouvez utiliser la méthode FromSQL:

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

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

10
ErikEJ

Pour faire gagner une heure à quelqu'un d'autre ...

La réponse d'ErikEJ fonctionne parfaitement mais j'avais d'abord un travail supplémentaire à faire.

Suite à une première migration de code inverse (vers une base de données existante avec des procédures stockées), j'ai eu un problème où les procédures stockées sur une base de données existante ne retournaient pas la table standard (par exemple la liste de Blog), mais une classe différente (par exemple la liste de BlogTitleAndSummary) qui n'était pas dans la base de données (et donc la migration).

Ce message a déclaré que le retour doit être un type d'entité , dont je n'étais pas sûr, mais n autre des messages Eriks m'a indiqué la bonne direction.

Pour que ce scénario fonctionne:

J'ai créé une classe de "BlogTitleAndSummary", marqué une propriété comme [key].

par exemple.

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

    public string Title { get; set; }

    public string ShortSummary { get; set; }
}

Ensuite, je l'ai ajouté en tant que DbSet sur le contexte, par exemple.

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; }
    ...
}

Cela m'a permis d'utiliser la syntaxe suivante pour appeler des procédures stockées:

REMARQUE: j'ai mis à jour ceci suite au commentaire ci-dessous. Utilisez les paramètres de la méthode FromSql. N'utilisez pas d'interpolation de chaîne pour de telles requêtes SQL .

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