框架4上的实体框架5包含具有相同表的多个外连接

时间:2013-08-07 14:18:17

标签: entity-framework-5

在Windows 2008 R2服务器上部署时,我的应用程序出现了一个非常奇怪的问题。

鉴于这个非常简单的LINQ片段:

return From
    invoice In Me.Invoices
Where
    loggedCustomerID.Contains(invoice.Contract.CustomerID)
Order By
    invoice.Date Descending

应用程序可以运行,但在一些情况下(在客户服务器上),生成的T-SQL非常奇怪:

 SELECT 
    [Extent1].[ContractID] AS [ContractID], ...
 FROM
    [dbo].[Invoice] AS [Extent1]
    INNER JOIN [dbo].[Contract] AS [Extent2] ON 
             [Extent1].[ContractID] = [Extent2].[ContractID]
    LEFT OUTER JOIN [dbo].[Contract] AS [Extent3] ON 
             [Extent1].[ContractID] = [Extent3].[ContractID]

 WHERE 
      [Extent2].[CustomerID] = 482283 
   OR [Extent3].[CustomerID] IN (498565,482282,498564,498566)
  • 表格多次链接(?)
  • IN语句分为多个T-SQL条件而不是单个IN语句

显然,在我的系统上生成正确的查询时,同一个包运行正常,而不会多次链接同一个表并只创建一个IN语句。

我使用的是EF 5.0但与Framework 4.0兼容(因此程序集显示版本4.4)。这是这个问题的根本原因吗?

这里可能有什么问题?

看起来行为与此有关? Too Many Left Outer Joins in Entity Framework 4?

2 个答案:

答案 0 :(得分:1)

我在NHibernate中遇到了类似的行为,也许你发现有任何相似之处。

我们变得简单parent - > children关系。关键是该关系是双向的,所以父母引用了所有孩子,并且他们每个人都引用了父母。

NHibernate支持我关闭的延迟抓取。因此,一旦我决定获取整个聚合,它就产生了有趣的查询,我的意思是所有孩子的父母。

类似的东西:

select ... from parent ... left join ... children ... left join parent

由于Nhibernate使用了第一级缓存,因此无法自动发现这些父实例是相同的,因为在查询执行时父级的缓存是空的。

稍后在解析生成的数据库数据集时,NHibernate发现父实体具有相同的主标识符,并且只返回一个实例。

答案 1 :(得分:0)

最后我能够进行一些测试。似乎EF T-SQL生成在很大程度上取决于不良框架。实际上,只需将框架升级到4.5即可解决上述问题。