Entity Framework: dove posso estendere CSDL / MSL?

Sto usando Entity Framework 4. Sto usando un primo modello di database, nel senso che ho generato l’EDM dal database. Ora voglio aggiungere alcune funzioni definite dal modello. La mia domanda è … dove?

Se li metto nel file .edmx, non tutte le mie aggiunte saranno danneggiate la prossima volta che aggiornerò il database e genererò il nuovo EDM? Voglio dire che lo dice proprio lì all’inizio del file .Designer.cs, “Le modifiche manuali a questo file verranno sovrascritte se il codice viene rigenerato.”

Quindi, in quale file inserisco le mie aggiunte?

Lo prenderò un po ‘in profondità perché le funzioni definite dal modello non sono molto conosciute.

Le funzioni definite dal modello devono essere aggiunte manualmente alla parte CSDL del file EDMX. È necessario aprire il file come XML e aggiungere una funzione. Ad esempio questa funzione definita dal modello è in grado di produrre il nome completo del dipendente:

   Trim(emp.FirstName) + " " + Trim(emp.LastName)   

Ora puoi salvare EDMX e tornare al designer. La funzione sarà ancora presente ma non è visibile nel browser Modello. È ansible aggiornare il modello dal database o eliminare tutte le quadro, ma la funzione verrà comunque definita. EF non rimuove le modifiche personalizzate nella parte CSDL di EDMX.

Ora è necessario definire la funzione .NET per poter utilizzare questa funzione definita dal modello. Puoi farlo ovunque. Un modo è usare la class parziale nel contesto, ma nello stesso tempo puoi semplicemente usare una class di cutom:

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

E hai finito. L’unica attività rimanente è l’utilizzo della funzione nella query Linq-to-entities:

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

Le funzioni definite dal modello sono solo alcune Entità SQL riutilizzabili tradotte in SQL in modo che possano essere utilizzate solo nelle query Linq-to-entities. Le funzioni definite dal modello possono essere molto più complicate.