2011-02-23 21 views
32

Tengo una tabla en mi base de datos con muchos campos. La mayoría de las veces necesito todos esos campos. Sin embargo, hay un escenario en el que solo necesito algunos de los campos, y estoy cargando una tonelada de filas.¿Asignar dos entidades diferentes a la misma tabla?

Lo que me gustaría hacer es agregar una entidad manualmente, y luego simplemente asignarla a la tabla original, pero eliminar las columnas que no necesito. Me puse todo esto, pero me sale el error en lugar de auto-explicativo de:

problema en fragmentos de mapeo ... EntitySets 'FmvHistoryTrimmed' y '' son ambos FMVHistories asignada a tabla 'FMVHistory'. Sus claves principales pueden colisionar.

¿Hay alguna otra manera en que deba hacerlo? Una vez más, la mayoría de las veces se utilizan todas las columnas, por lo que no quiero recortar la entidad original y poner los campos "extra" en un tipo complejo.

+0

Tengo una solución, de Aducci, pero voy a dejar esto sin respuesta si alguien tiene una forma EF real para lograr esto en la forma en que originalmente estaba buscando –

Respuesta

30

No puede asignar dos entidades regulares en la misma tabla. Tiene varias opciones:

  1. Utilice la división de la tabla.
  2. Uso consulta personalizada con la proyección de tipo no entidad (como se propuso @Aducci)
  3. Uso QueryView
  4. vista Uso de bases de datos o directamente DefiningQuery

Tabla división

Table splitting le permite mapea una tabla en dos entidades en relación 1: 1. La primera entidad contendrá solo PK y un subconjunto de campos que siempre necesitará. La segunda entidad contendrá todos los demás campos y PK. Ambas entidades contendrán propiedad de navegación entre ellas. Ahora, si solo necesita un subconjunto de campos, consultará la primera entidad. Si necesita todos los campos, consultará la primera entidad e incluirá la propiedad de navegación en la segunda entidad. También puede cargar la segunda entidad de forma perezosa si la necesita.

QueryView

QueryView es ESQL consulta definida directamente en su asignación (MSL) y se asigna a un nuevo tipo de entidad de sólo lectura. Puede usar QueryView para definir la proyección de su entidad completa en subentidades. QueryView se debe definir manualmente en EDMX (no está disponible en el diseñador). Como sé, QueryView no está disponible en el Código primero, pero en realidad es lo mismo que la proyección personalizada para el tipo de entidad no.

DefiningQuery

DefiningQuery consulta personalizada es definida directamente en su modelo de almacenamiento (LSCD).DefiningQuery se usa generalmente cuando se asigna a vistas de bases de datos, pero puede usarlo para cualquier SQL SELECT personalizado. Mapeará el resultado de la consulta al tipo de entidad de solo lectura. DefiningQuery se debe definir manualmente en EDMX (no está disponible en el diseñador). También no está directamente disponible en el Código primero, pero en realidad es lo mismo que llamar al SqlQuery en DbDatabase. El problema con DefiningQuery es que una vez que lo defines manualmente en SSDL no puedes usar el modelo de actualización de la base de datos porque esta operación reemplaza el SSDL completo y elimina la definición de tu consulta.

+0

Aquí hay un tutorial muy simple de MSDN que recorre la técnica de división de entidades: http://msdn.microsoft.com/en-us/data/jj715646.aspx Sin embargo, dependiendo de la estructura de su modelo de datos con las claves primarias, puede tener para remodelar el modelo. – Flea

+0

¿Se podría implementar la división de tabla en hibernación? –

+0

Intenté implementar Table Splitting como se describe [aquí] (http://weblogs.asp.net/manavi/associations-in-ef-4-1-code-first-part-4-table-splitting). Lo que sucedió es que EF insistió en cambiar el nombre de los campos compartidos a XXXX1. Por ejemplo, Link {int LinkId; int DocIdRight; int DocIdLeft} y LinkPartial {int LinkId; int DocIdRight;} ==> Al actualizar un objeto LinkPartial, EF intentó actualizar tanto DocIdRight como DocIdRight1. – Dror

7

Crearía una Vista en la base de datos que contenga solo los datos que necesita y agregue la Vista a su modelo de datos de entidad.

Si no desea modificar la base de datos, puede crear un Linq para entidades o una declaración ESQL proyectando a una clase POCO con solo la información que necesita.

public IQueryable<SimpleObject> GetView(DBContext context) 
{ 
    return (from obj in context.ComplexObjects 
      select new SimpleObject() { Property1 = obj.Property1, 
             Property1 = obj.Property2 
             }); 
} 
+0

Definitivamente no quería crear una vista, pero la expresión linq personalizada debería funcionar. También hay una relación 1..0 | 1 allí, pero una simple unión externa de linq también debería incluir eso. Solo pensé que sería un poco más elegante mapear esto en el diseñador de EF. ¡Gracias por su respuesta! –

Cuestiones relacionadas