2011-04-10 14 views
18

Estoy usando Entity Framework 4. Estoy usando un primer modelo de base de datos, lo que significa que he generado el EDM desde la base de datos. Ahora quiero agregar algunas funciones definidas por el modelo. Mi pregunta es ... ¿dónde?Entity Framework: ¿Dónde extiendo el CSDL/MSL?

Si los puse en el archivo .edmx, ¿no se eliminarán todas mis adiciones la próxima vez que actualice la base de datos y genere el nuevo EDM? Quiero decir que lo dice justo en la parte superior del archivo .Designer.cs, "Los cambios manuales a este archivo se sobrescribirán si el código se regenera".

Entonces, ¿en qué archivo agrego mis adiciones?

Respuesta

33

Voy a profundizar un poco porque las funciones definidas por el modelo no son muy conocidas.

Las funciones definidas por el modelo se deben agregar manualmente a la parte CSDL del archivo EDMX. Debe abrir el archivo como XML y agregar una función. Por ejemplo, esta función se define el modelo es capaz de producir el nombre completo del empleado:

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

Ahora usted puede guardar su EDMX y volver al diseñador. La función seguirá presente pero no es visible en el navegador de modelos. Puede actualizar su modelo desde la base de datos o eliminar todas sus entidades, pero la función aún estará definida. EF no elimina la modificación personalizada en la parte CSDL de EDMX.

Ahora necesita definir la función .NET para poder usar esta función definida por el modelo. Puedes hacerlo en cualquier lugar. Una forma es utilizar la clase parcial de contexto, pero en el mismo tiempo, puedes usar alguna clase cutom:

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

y ya está. La tarea sólo restante está utilizando la función de consulta LINQ-a-entidades:

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

funciones definidas por el modelo son sólo algunas reutilizable Entity SQL que se traduce a SQL para que puedan ser utilizado en las consultas LINQ a las entidades . Las funciones definidas por el modelo pueden ser mucho más complicadas.

+2

Gran respuesta: es bueno saber que las funciones definidas por el modelo no se destruyen al actualizar el modelo – BrokenGlass

+2

Como seguimiento, también hay un artículo de MSDN sobre esto: [Cómo: Definir funciones personalizadas en el modelo conceptual (Entidad Framework)] (http://msdn.microsoft.com/en-us/library/dd456812.aspx) –

+0

La respuesta de Joel Mueller a otra pregunta es similar a la que mencionó: es muy exhaustiva y también muestra cómo hacer esto. trabajo para LINQ-to-Objects también: [LINQ to Entities no reconoce el método 'Double Parse (System.String)' método, y este método no se puede traducir a una expresión de tienda] [1] [ 1]: http://stackoverflow.com/a/5971677/35133 –