2011-04-10 1 views
18

J'utilise Entity Framework 4. J'utilise un premier modèle de base de données, ce qui signifie que j'ai généré l'EDM à partir de la base de données. Maintenant, je veux ajouter quelques fonctions définies par le modèle. Ma question est ... où? Si je les mets dans le fichier .edmx, tous mes ajouts ne seront-ils pas modifiés la prochaine fois que je mettrai à jour la base de données et que je générerai le nouvel EDM? Je veux dire qu'il l'indique juste en haut du fichier .Designer.cs, "Les modifications manuelles apportées à ce fichier seront remplacées si le code est régénéré."Entity Framework: Où puis-je étendre le CSDL/MSL?

Alors, dans quel fichier dois-je mettre mes ajouts?

Répondre

33

Je vais le prendre un peu en profondeur parce que les fonctions définies par le modèle ne sont pas très bien connues.

Les fonctions définies par le modèle doivent être ajoutées manuellement à la partie CSDL du fichier EDMX. Vous devez ouvrir le fichier au format XML et ajouter une fonction. Par exemple, cette fonction de modèle défini est capable de produire le nom complet de l'employé:

<Function Name="FullName" ReturnType="Edm.String"> 
    <Parameter Name="emp" Type="TestModel.Employee" /> 
    <DefiningExpression> 
    Trim(emp.FirstName) + " " + Trim(emp.LastName) 
    </DefiningExpression> 
</Function> 

Maintenant, vous pouvez enregistrer votre EDMX et revenir au concepteur. La fonction sera toujours présente mais elle n'est pas visible dans le navigateur Modèle. Vous pouvez mettre à jour votre modèle à partir de la base de données ou supprimer toutes vos entités mais la fonction sera toujours définie. EF ne supprime pas les modifications personnalisées dans la partie CSDL d'EDMX.

Vous devez maintenant définir la fonction .NET pour pouvoir utiliser cette fonction définie par le modèle. Vous pouvez le faire n'importe où. La première consiste à utiliser la classe partielle contexte, mais dans le même temps, vous pouvez simplement utiliser une classe cutom:

public static class EdmFunctions 
{ 
    [EdmFunction("TestModel", "FullName")] 
    public static string FullName(Employee e) 
    { 
     throw new NotSupportedException("This function is only for L2E query."); 
    } 
} 

Et vous avez terminé. La seule tâche restante utilise la fonction dans Linq à des entités requête:

using (var context = new TestEntities()) 
{ 
    var query = from e in context.Employees 
       select new 
        { 
         e.Id, 
         FullName = EdmFunctions.FullName(e) 
        }; 
    var data = query.ToList(); 
    ... 
} 

fonctions définies modèles sont quelques-unes SQL réutilisable entité qui se traduit à SQL afin qu'ils puissent être utilisés que dans LINQ-à-entités requêtes . Les fonctions définies par le modèle peuvent être beaucoup plus compliquées.

+2

Bonne réponse - les fonctions définies par le modèle ne sont pas détruites lors de la mise à jour du modèle – BrokenGlass

+2

Par la suite, un article MSDN est également disponible: [Comment: définir des fonctions personnalisées dans le modèle conceptuel (Entité Framework)] (http://msdn.microsoft.com/en-us/library/dd456812.aspx) –

+0

La réponse de Joel Mueller à une autre question est similaire à ce que vous avez mentionné - c'est très complet et montre aussi comment faire cela fonctionne également pour LINQ-to-Objects: [LINQ to Entities ne reconnaît pas la méthode 'Double Parse (System.String)' méthode, et cette méthode ne peut pas être traduite en une expression de magasin] [1] [ 1]: http://stackoverflow.com/a/5971677/35133 –