2011-10-31 5 views
5

Mon scénario J'utilise Visual Studio 2010 avec Entity Framework 4.1 J'ai une base de données héritée avec de nombreuses tables et de nombreuses procédures stockées. J'écris un programme ASP.NET C# en utilisant MVC 3Mappage de procédures stockées sélectionnées dans le framework d'entité

J'ai adopté la conception 'base de données d'abord' en utilisant ADO.NET DbContext, j'ai donc un edmx avec tous les modèles et associations et propriétés de navigation bien mis en place. Je peux mapper l'insertion, mettre à jour, supprimer des procédures pour les modèles concernés. J'ai utilisé 'Importation de fonction' pour importer d'autres procédures stockées. Cependant, je n'arrive pas à trouver un moyen de mapper mes procédures Select pour sélectionner des actions (sélectionner par identifiant, sélectionner une liste, sélectionner par filtre, etc.). EF semble utiliser le chargement paresseux, ce que je veux arriver, c'est quand un objet récupère ses objets enfants, il utilise les procédures stockées déjà écrites. (Les procédures de sélection tiennent compte d'une « isDeleted » drapeau, et d'utiliser le «ORDER BY clause, entre autres)

Je vois de cet article http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx que LINQ to SQL permet le glisser-déposer de SPs, qui sonne, plus ou moins, exactement ce que je veux.

Je suis également tombé sur le terme DefiningQuery. http://msdn.microsoft.com/en-us/library/cc982038.aspx Est-ce ce que je veux? Je n'aime pas la note "Toutes les modifications apportées au modèle de stockage, y compris la définition des requêtes, seront remplacées lorsque vous exécuterez l'Assistant Modèle de mise à jour". En résumé, ce que je veux arriver, c'est quand un objet récupère ses objets enfants, il utilise mes procédures stockées. Puis-je atteindre mon objectif en utilisant Entity Framework? Ai-je manqué quelque chose d'évident?

Ou devrais-je essayer d'être très intelligent et modifier le modèle T4 db entité, de sorte que, par exemple, mon modèle généré d'adresse a cette propriété:

public virtual ICollection<AddressLine> AddressLines { 
    get{ 
     DBWrapper _db = new DBWrapper(); 
     return _db.GetAddressLines(AddressID); 
    } 
    set{}; 
} 

où GetAddressLines est fonction personnalisée qui appelle une fonction importer et fait les conversions neccessary.

Répondre

6

Ce n'est pas possible. Vous pouvez importer vos procédures stockées en tant qu'importations de fonctions et les exécuter manuellement, mais vous ne pouvez pas remplacer les requêtes générées par EF avec des procédures stockées personnalisées.

+0

Merci. Cela confirme ce que je soupçonnais – Webbie4

2

Sauf que vous pouvez, en quelque sorte. Prenez la procédure stockée select la plus basique (c'est-à-dire, celle qui est la plus proche de "select * from mytable", et utilisez-la pour définir une vue dans votre base de données. Ensuite, utilisez la fonction d'importation pour vos sélections plus sélectives et définissez-les pour retourner les collections de votre entité. Donc, si vous aviez quelque chose comme une entité Person, et que vous aviez un proc stocké comme FetchPersonByAge (int), votre entité se retrouverait avec une méthode statique appelée quelque chose comme "GetByAge (int)". code comme ceci: var people33 = Person.getByAge (33); J'ai fait cela, et cela a très bien fonctionné, me permettant de respecter une base de données existante: les concepteurs exigent que tous les accès à la base de données passent par leurs process stockés, et aucun code utilisateur n'accède directement aux tables. Voir l'article de Julie Lerman:

http://msdn.microsoft.com/en-us/data/gg699321.aspx

Dave