我有一个名为Image的实体类型,它继承自Publication(有5种其他类型的Publications,都共享10个公共属性)。
不幸的是,我的数据库中的Image表包含4个二进制列,其中包含4个不同分辨率图像版本的数据,因此EF Image类型有4个属性:BinOriginal,BinHiRes,BinLowRes,BinThumbnail,包含非常大量数据。
这会影响性能。例如,当我只生成一系列图像链接时,我不想获取所有二进制数据。
所以我尝试了表格拆分,将4个二进制字段放入一个新的ImageFile实体a:http://blogs.msdn.com/b/adonet/archive/2008/12/05/table-splitting-mapping-multiple-entity-types-to-the-same-table.aspx
我确保了正确的表映射,添加了1-1关联并包含了引用约束,但是我收到了这个错误:
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.
...似乎存在一个问题,即被拆分的表涉及继承关系。
我尝试从Publication继承新的ImageFile EF类型,但后来出现错误:
Problem in mapping fragments starting at lines 2332, 2374:Two entities with
different keys are mapped to the same row
问题有没有办法解决这个问题,或者我需要图片EF类型继承出版物的事实是否排除了将其他字段拆分为新类型?
答案 0 :(得分:1)
您可以将此视为实体框架的限制:实际上有两个部分,即底层数据库项的模型,以及从模型构建的实体。实体的子类不会影响模型。
如果您不想加载Model行的所有数据,请将其投影:
var results = from product in myDB.Products
where product.Id == productId
select New
{
Id = product.Id,
Name = product.Name,
ImageUrl = product.ImageUrl
};
Entity Framework创建的SQL查询仅选择LINQ查询的select
子句中的列。
这也使Entity Framework不会将表行存储到ObjectContext
(或EF {5 {1}}对象中。
作为旁注,我个人很想将大量二进制数据存储在NoSQL解决方案中,并且只是自己维护SQL数据库中的相关密钥。