如何在实体框架中将多个表映射到单个实体,并使用外连接

本文关键字:实体 单个 连接 映射 框架 | 更新日期: 2023-09-27 18:15:30

我有两个表:

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

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

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

我想合并发票&InvoiceSummary表合并为单个实体对象,同时保留单独的表,以便如上所述的BCP方便。但是,在InvoiceSummary中可能并不总是有匹配的行。

看起来实体框架需要两个表之间的1对1映射来实现合并的实体。有人知道我如何能得到实体框架表示这与0到1的映射?

如果我没有找到一个实体框架的解决方案,我可以使用一个视图来"隐藏"底层的表结构。我正在使用SQL server,它支持可更新的视图,所以这应该是透明的EF?也欢迎其他结构的解决方案

如何在实体框架中将多个表映射到单个实体,并使用外连接

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

还有一些其他的选项:

  • 如果不需要查询结果,可以创建存储程序在数据库中。可以映射到EDMX中的函数或者先在代码中通过函数执行。
  • 如果你确实需要查询结果,你正在使用EDMX,我仍然将实体映射到视图是可行的方法。
  • 如果您首先使用代码,并且您确实需要查询结果,但是只读可以,你可以使用dbcontext.database. executeccommand。

hth(并希望我已经得到了所有正确的,因为它是从记忆…我不相信……这就是为什么我把这些东西写在书里!)