2013-08-07 25 views
1

在Windows 2008 R2服务器上部署时,我的应用程序出现非常奇怪的问题。框架4上的实体框架5,包含和多个具有相同表格的外部联接

鉴于这种非常简单的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?

回答

0

最后我能够进行一些测试。看起来,EF T-SQL的生成在很大程度上依赖于未定义的框架。实际上,只需将框架升级到4.5即可解决上述问题。

1

我遇到过类似NHibernate的行为,也许你会发现任何相似之处。

我们得到了简单的parentchildren的关系。关键是该关系是双向的,所以父母引用了所有孩子,并且他们每个人都有参照回到父母。

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

喜欢的东西:

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

例如NHibernate使用一级缓存引擎盖下,它无法自动发现,那些父母实例相等父的缓存在时间空查询执行。

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

+0

嗨马丁,谢谢你的回答!我将尝试删除延迟加载选项并查看会发生什么,但是在我的机器上(.NET Framework 4.5 vs 4.0?)都运行正常,它在2003 R2 Box以及2008上R2的盒子,我有这种奇怪的行为...我将尝试升级到2008年的盒子上的.NET 4.5,因为在2003年不支持,并回来一些反馈! – adrianot75