113 votes

Entity Framework Code First prend-il en charge les procédures stockées ?

J’ai regardé plusieurs présentations de EF Code First et n’ont pas vu comment EFCF fonctionne avec des procédures stockées.

Comment puis-je déclarer une méthode qui utilise certains sp ? Je peux passer une entité à une méthode qui appelle sp sans cartographie manuellement les propriétés d’entité aux paramètres sp ?

En outre, que se passe-t-il si je change mon modèle ? Il passerait de mon sp tout en recréant la table du modèle ? Et Quid des déclencheurs ?

Si ces choses ne sont pas pris en charge, y a-t-il des plans pour les soutenir à l’avenir ?

65voto

anon Points 3824

EDIT: Ma réponse originale à cette question pour EF4.1 (ci-dessous) est maintenant obsolète. Veuillez voir la réponse ci-dessous à partir de Diego Vega (qui travaille sur l'équipe EF chez Microsoft)!


@gsharp et Shawn Mclean: Où en êtes-vous de cette information? Ne pas vous avez toujours accès à la ObjectContext sous-jacente?

IEnumerable<Customer> customers = 
    ((IObjectContextAdapter)this)
    .ObjectContext.ExecuteStoreQuery<Customer>("select * from customers");

Remplacer le "select" avec une procédure stockée, et là vous allez.

Quant à votre question: Oui, malheureusement, votre s.p. s'obtiendrez touchée. Vous pouvez avoir besoin d'ajouter l'option "CRÉER la PROCÉDURE des" énoncés dans le code.

Pour EF 4.2:

var customers = context.Database.SqlQuery<Customer>("select * from customers")

51voto

divega Points 2935

Mise à jour: à Partir de EF6, EF le Premier Code prend en charge la procédure stockée de cartographie pour les insertions, mises à jour et suppressions. Vous pouvez spécifier une procédure stockée cartographie lors de la création du modèle à l'aide de la MapToStoredProcedures méthode. Nous avons également le soutien automatique à l'échafaudage de base des procédures stockées pour ces opérations. Consultez les spécifications ici.

Réponse originale à cette question: Nous n'avons pas le soutien pour la cartographie des procédures stockées dans le modèle dans le Code-Première dans la première version, ni nous aurons un moyen de générer automatiquement des procédures stockées pour les opérations CRUD de vos types. Ce sont les fonctionnalités que nous aimerions ajouter à l'avenir.

Comme il a été mentionné dans ce fil, il est possible de revenir à ObjectContext mais aussi, DbContext donne une belle Api pour exécuter natif des requêtes SQL et des commandes (par exemple, DbSet.SqlQuery, DbContext.La base de données.SqlQuery et DbContext.La base de données.ExecuteSqlCommand). Les différents SqlQuery versions ont la même base matérialisation fonctionnalité qui existe dans EF4 (comme ExecuteStoreQuery: http://msdn.microsoft.com/en-us/library/dd487208.aspx).

Espérons que cette aide.

31voto

Mark Points 351
    public IList<Product> GetProductsByCategoryId(int categoryId)
    {
        IList<Product> products;

        using (var context = new NorthwindData())
        {
            SqlParameter categoryParam = new SqlParameter("@categoryID", categoryId);
            products = context.Database.SqlQuery<Product>("Products_GetByCategoryID @categoryID", categoryParam).ToList();
        }

        return products;
    }

    public Product GetProductById(int productId)
    {
        Product product = null;

        using (var context = new NorthwindData())
        {
            SqlParameter idParameter = new SqlParameter("@productId", productId);
            product = context.Database.SqlQuery<Product>("Product_GetByID @productId", idParameter).FirstOrDefault();
        }

        return product;
    }

8voto

Luc Bos Points 1126

Une solution de sécurité de type plus serait ceci :

http://www.lucbos.net/2012/03/Calling-Stored-Procedure-with-Entity.html

L’utilisation de cette classe est :

2voto

Julie Lerman Points 2407

d’accord avec Shawn & gsharp. Tout d’abord le code + Stored Procs est kindofan oxymore. :) Je ne sais pas sur tous les plans qu’il en soit de la milliseconde, cependant. Quelle serait votre raison de vouloir tous les deux. Vous essayez d’utiliser CF avec une base de données héritée ?

@anon... exécution de sql brute n’est pas le même que l’exécution d’une procédure stockée. :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X