10

我有一个名为 Image 的实体类型,它继承自 Publication(还有 5 种其他类型的 Publication,都共享 10 个公共属性)。

不幸的是,我的数据库中的 Image 表包含 4 个二进制列,其中包含 4 个不同分辨率的图像版本的数据,因此 EF Image 类型有 4 个属性:BinOriginal、BinHiRes、BinLowRes、BinThumbnail,其中包含大量数据。

这会影响性能。例如,当我只是生成一系列图像链接时,我不想获取所有二进制数据。

所以我尝试了表拆分,将 4 个二进制字段放入一个新的 ImageFile 实体中:http: //blogs.msdn.com/b/adonet/archive/2008/12/05/table-splitting-mapping-多个实体类型到同一个表.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

问题有什么办法可以解决这个问题,或者我需要 Image EF 类型从 Publication 继承这一事实是否会阻止将其他字段拆分为新类型?

4

1 回答 1

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 查询仅选择selectLINQ 查询子句中的列。

这也使 Entity Framework 无法将表行存储到ObjectContext(或DBContext用于 EF 5)对象中。

作为旁注,我个人很想将较大的二进制数据存储在 NoSQL 解决方案中,并自己维护 SQL 数据库中的关联键。

于 2012-12-10T11:10:41.413 回答