entity framework - tips - ¿Asignar dos entidades diferentes a la misma tabla?
mapeo entity framework (2)
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.
Lo que me gustaría hacer es agregar una Entidad de forma manual, y luego simplemente asignarla a la tabla original, pero eliminar las columnas que no necesito. Configuré todo esto, pero obtengo el error bastante autoexplicativo de:
Problema en el mapeo de fragmentos ... EntitySets ''FmvHistoryTrimmed'' y ''FMVHistories'' están mapeados en la tabla ''FMVHistory''. Sus llaves principales pueden colisionar.
¿Hay alguna otra manera en que debería 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.
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 de 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
});
}
No puede asignar dos entidades regulares en la misma tabla. Usted tiene varias opciones:
- Usa la división de tablas.
- Utilice una consulta personalizada con proyección para el tipo de entidad no (como @Aducci propuesto)
- Use QueryView
- Utilice la vista de la base de datos o directamente DefiningQuery
División de tablas
La división de tablas le permite mapear 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 una consulta ESQL definida directamente en su mapeo (MSL) y está mapeada a un nuevo tipo de entidad de solo 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.
DefintingQuery
DefiningQuery es una consulta personalizada definida directamente en su modelo de almacenamiento (SSDL). 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 a 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.