2012-04-10 14 views
10

Tengo un tipo de entidad llamado Imagen que hereda de la Publicación (hay otros 5 tipos de Publicaciones, todas comparten 10 propiedades comunes).División de tabla de un tipo de entidad heredada?

Desafortunadamente, la tabla de imágenes en mi base de datos incluye 4 columnas binarias con los datos de 4 versiones de la imagen en diferentes resoluciones, por lo que hay 4 propiedades del tipo de imagen EF: BinOriginal, BinHiRes, BinLowRes, BinThumbnail, que contienen grandes cantidades de datos.

Esto está afectando el rendimiento. No quiero tomar todos los datos binarios cuando estoy generando una serie de enlaces de imagen, por ejemplo.

Así que he intentado tabla de división, la colocación de los 4 campos binarios en una nueva entidad a la ImageFile: http://blogs.msdn.com/b/adonet/archive/2008/12/05/table-splitting-mapping-multiple-entity-types-to-the-same-table.aspx

he asegurado la correcta tabla de mapeo, añade la asociación 1-1 y contó con la restricción de referencia, pero estoy recibiendo este error:

Error 3033: Problem in mapping fragments starting at line 2731:EntitySets 
'ImageFiles' and 'Publications' are both mapped to table 'Images'. Their primary 
keys may collide. 

... parece que hay un problema porque la mesa que se divide está involucrado en una relación de herencia.

He intentado heredar el nuevo tipo de publicación ImageFile EF, pero luego me sale un error:

Problem in mapping fragments starting at lines 2332, 2374:Two entities with 
different keys are mapped to the same row 

PREGUNTA ¿Hay alguna forma de evitar esto, o es el hecho de que necesito la Imagen ¿El tipo EF para heredar de Publicación impide dividir los otros campos en un tipo nuevo?

+1

¿Puede cambiar el esquema de la base de datos? Es decir. hacer una tabla separada para las imágenes? –

+0

Sí, eso es lo que he hecho ahora como un "work-around" (en realidad es un mejor diseño de DB, pero fue mucho más trabajo dado que el DB ya está en producción). Mi pregunta sobre la división de tablas sigue en pie: todavía es un aspecto de EF que quiero entender. Si puede verificar/documentar que simplemente no es posible dividir una tabla que es un subtipo en una relación de herencia, eso será suficiente para que yo acepte una respuesta. – Faust

+0

OK, entendido, pero no estoy seguro si voy a profundizar en eso :). –

Respuesta

1

Puede considerar esto como una limitación de Entity Framework: en realidad, hay dos elementos, el Modelo del elemento de la base de datos subyacente y la Entidad compilada a partir del Modelo. La subclase de la Entidad no afecta al Modelo en absoluto.

Si no desea cargar todos los datos para una fila de modelo, proyecto que:

var results = from product in myDB.Products 
       where product.Id == productId 
       select New 
       { 
        Id = product.Id, 
        Name = product.Name, 
        ImageUrl = product.ImageUrl 
       }; 

La consulta SQL que Entity Framework crea sólo selecciona las columnas de la cláusula de la select Consulta LINQ.

Esto también evita que Entity Framework almacene la fila de la tabla en el objeto ObjectContext (o DBContext for EF 5).

Como nota al margen, estaría personalmente tentado a almacenar datos binarios de gran tamaño en una solución NoSQL, y simplemente mantener la clave asociada en la base de datos SQL.

Cuestiones relacionadas