如何在实体框架中使用外部联接将多个表映射到单个实体?

时间:2011-11-21 16:00:24

标签: c# entity-framework mapping outer-join

我有两张桌子:

发票(ID,InternalPrice,ExternalPrice)
InvoiceSummary (InvoiceID,Variance)

在这个应用程序中,我们有一个流程通过Invoice表,在Entity Framework中创建对象表示。然后,应用程序必须计算(InternalPrice - ExternalPrice)之间的差异并将其存储在Variance列中。

为了允许实体框架在大量行(约500万)上有效地执行此操作,我已将计算结果分离为单个表。这允许我使用对象表示来计算方差(加上其他业务逻辑),然后使用“SQL批量插入”将数据快速插入到我的数据库中(比正常的实体更新快得多)。

我想合并Invoice&将InvoiceSummary表分成单个实体对象,同时为BCP纵容保留单独的表,如上所述。但是,InvoiceSummary中可能并不总是存在匹配的行。

看起来Entity Framework需要在两个表之间进行1对1映射才能实现合并实体。 有谁知道我如何让实体框架用0到1的映射来表示?

如果我找不到实体框架解决方案,我可以使用视图来“隐藏”基础表结构。我正在使用支持可更新视图的SQL服务器,所以这应该对EF透明?也欢迎替代结构解决方案。

1 个答案:

答案 0 :(得分:2)

您的结论是正确的,即实体拆分(跨多个表拆分单个实体)需要表之间的1:1关系。如果您能够向数据库添加视图,我认为您最好选择该路径,然后将该视图映射到单个实体。这个提出的解决方案有一个很大的警告。除非您可以在数据库中创建可更新视图,否则您将获得只读视图,并且只能使用EDMX(设计器)映射到只读视图。 Code First不支持映射到只读视图。

还有其他一些选择:

  • 如果您不需要查询结果,则可以创建存储 数据库中的程序。这可以映射到EDMX中的函数 或者首先通过代码中的函数执行。
  • 如果您确实需要查询结果并且您正在使用EDMX,我仍然 认为将实体映射到视图是可行的方法。
  • 如果您首先使用代码,但确实需要查询结果,但是 只读是可以的,您可以使用dbcontext.database.executecommand。
(并且希望我得到的一切都是正确的,因为它来自记忆......我不相信......这就是为什么我把这些东西写在书中!)

相关问题