【问题标题】:How do I map multiple tables to single entity, with an outer join, in Entity Framework?如何在实体框架中将多个表映射到具有外部连接的单个实体?
【发布时间】:2012-01-03 02:49:40
【问题描述】:

我有两张桌子:

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

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

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

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

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

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

【问题讨论】:

  • 我尝试使用视图来创建我正在寻找的实体结构。虽然 SQL Server 支持可更新视图,但 EF 似乎创建了一个只读实体对象。不幸的是,这不太符合我的要求,因为我需要更新访问权限。我知道我可以手动更改 EDML 以允许将更新应用于视图,但是每次从数据库更新模型时都需要重新应用这些手动编辑。这似乎是一种倒退——除非有其他方法?

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


【解决方案1】:

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

还有其他几个选项:

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

hth(希望我已经完全正确,因为它来自记忆......我不相信......这就是我把这些东西写在书里的原因!)

【讨论】:

  • 感谢朱莉的回复。我使用的是 SQL Server 2005,因此支持可更新视图。我确实需要存储方差计算的输出,因为在许多情况下,这个计算并不像我上面所说的那样“便宜”!但是函数映射是个好主意,我可能会在代码的其他地方使用它。我实际上并没有在这里首先使用代码 - 但我想任何一个都可以工作。谢谢!
  • 顺便说一句,我对您如何在您的应用程序中结合 EF 和 SQLBulkInsert 感兴趣。我猜它们是完全不相关的操作,但如果不是,是的,非常感兴趣! (我有一些想法,但是......)请随意将我离线,因为这与这篇文章完全无关。 [thedatafarm.com/blog/contact/]
  • 我试图让两者保持紧密联系。其他细节我会告诉你的。我目前正在完成概念验证。
猜你喜欢
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多