将两个不同的实体映射到同一个表中?

问题描述:

我在我的数据库中有很多字段的表。 大部分时间我需要所有这些字段。然而,有一种情况是我只需要一些字段,而我正在加载大量的行。将两个不同的实体映射到同一个表中?

我想要做的是手动添加一个实体,然后将其映射到原始表,但删除我不需要的列。我处理这件事,但我得到的相当不言自明的错误:

问题的映射片段 ... EntitySets“FmvHistoryTrimmed”和 “FMVHistories”都映射到 表“FMVHistory”。他们的主键 可能会发生碰撞。

有没有其他方法我应该去做这件事?同样,大部分时间都使用了所有的列,所以我不想裁减原始实体并将“额外”字段设置为复杂类型。

+0

我有一个解决方法,从Aducci,但我会离开这个没有回答,如果任何人有一个实际的EF方式来完成这个我最初寻找的方式 – 2011-02-23 16:53:53

您不能将两个常规实体映射到同一个表中。你有几种选择:

  1. 使用表分割。
  2. 与投影到非实体类型(如@Aducci建议)
  3. 使用QueryView
  4. 使用数据库视图或直接使用DefiningQuery自定义查询

表拆分

Table splitting让你以1:1关系将表映射到两个实体。第一个实体将只包含您始终需要的PK和字段子集。第二个实体将包含所有其他领域和PK。两个实体都将包含导航属性。现在,如果只需要字段子集,您将查询第一个实体。如果您需要所有字段,您将查询第一个实体并将navifation属性包含到第二个实体。如果您需要,您也可以延迟加载第二个实体。

QueryView

QueryView是直接在映射(MSL)定义ESQL查询并将其映射到新的只读实体类型。您可以使用QueryView来定义完整实体到子实体的投影。 QueryView必须在EDMX中手动定义(它在设计器中不可用)。我知道QueryView在代码中不可用,但它实际上与非实体类型的自定义投影相同。

DefiningQuery

DefiningQuery是直接在您的存储模式(SSDL)定义的自定义查询。定义查询通常在映射到数据库视图时使用,但您可以将其用于任何自定义SQL SELECT。您将查询的结果映射为只读实体类型。定义查询必须在EDMX中手动定义(它在设计器中不可用)。它在代码中也不是直接可用的,但实际上与在DbDatabase上调用SqlQuery相同。 DefiningQuery的问题是,一旦你在SSDL中手动定义它,你就不能使用从数据库中更新模型,因为这个操作取代了完整的SSDL并删除了你的查询定义。

+0

下面是一个非常简单的MSDN教程,它介绍了实体拆分技术:http://msdn.microsoft.com/en-us/data/jj715646.aspx但是,根据具有主键的数据模型结构,您可能有重塑模型。 – Flea 2013-05-11 15:31:58

+0

可以在休眠中实现表拆分吗? – 2013-12-30 12:40:23

+0

我试图按照[这里](http://weblogs.asp.net/manavi/associations-in-ef-4-1-code-first-part-4-table-splitting)的描述来实现表分割。发生了什么事是EF坚持要将共享字段重命名为XXXX1。例如,链接{int LinkId; int DocIdRight; int DocIdLeft}和LinkPartial {int LinkId; int DocIdRight;} ==>更新LinkPartial对象时,EF试图更新DocIdRight和DocIdRight1。 – Dror 2014-10-10 21:10:47

我会在只包含您需要的数据的数据库上创建一个View,并将View添加到您的实体数据模型中。

如果您不想修改数据库,您可以创建一个Linq实体或投影到POCO类的ESQL语句,仅使用所需的信息。

public IQueryable<SimpleObject> GetView(DBContext context) 
{ 
    return (from obj in context.ComplexObjects 
      select new SimpleObject() { Property1 = obj.Property1, 
             Property1 = obj.Property2 
             }); 
} 
+0

我绝对不想创建一个视图,但自定义linq表达式应该可以工作。在那里也有1..0 | 1的关系,但是一个简单的linq外连接也应该把它拉进去。我只是觉得在EF设计师中映射它会更加优雅。谢谢您的回答! – 2011-02-23 16:53:10