表格拆分继承的实体类型?

时间:2012-04-10 08:52:53

标签: entity-framework-4

我有一个名为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类型继承出版物的事实是否排除了将其他字段拆分为新类型?

1 个答案:

答案 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数据库中的相关密钥。