在我使用的一个Web应用程序中: -
using (MvcApplication1.Models.PlumSoftwareEntities db = new Models.PlumSoftwareEntities())
{
var results = (from p in db.Work_Details
where p.CompanyID == 2
select new { p.ID, p.Dated, p.Employee1.Abbrev, p.Activity.ActivityCode }).ToList();
}
并生成此SQL: -
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Dated] AS [Dated],
[Extent2].[Abbrev] AS [Abbrev],
[Extent3].[ActivityCode] AS [ActivityCode]
FROM [dbo].[Work Details] AS [Extent1]
INNER JOIN [dbo].[Employees] AS [Extent2] ON [Extent1].[Employee] = [Extent2].[ID]
INNER JOIN [dbo].[Activity] AS [Extent3] ON [Extent1].[ActivityCodeID] = [Extent3].ActivityCodeID]
WHERE 2 = [Extent1].[CompanyID]
在另一个Web应用程序中,我使用与上面完全相同的linq,除了它产生这个SQL: -
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Dated] AS [Dated],
[Extent2].[Abbrev] AS [Abbrev],
[Extent3].[ActivityCode] AS [ActivityCode]
FROM [dbo].[Work Details] AS [Extent1]
INNER JOIN [dbo].[Employees] AS [Extent2] ON [Extent1].[Employee] = [Extent2].[ID]
LEFT OUTER JOIN [dbo].[Activity] AS [Extent3] ON [Extent1].[ActivityCodeID] = [Extent3].ActivityCodeID]
WHERE 2 = [Extent1].[CompanyID]
最后一个导航属性现在是LEFT OUTER JOIN
这种行为有什么设置,解释。
连接字符串与同一SQL服务器相同,具有相同的登录名,在两个应用程序中使用相同的Entity Framework 5,两者都运行ASP.NET 4.5
这是一个简单的例子,关于左外连接对我来说很重要的原因是我使用导航属性将实体表投影到DTO对象上,使用SQlDependency缓存这些查询。 SQLDependency要求所有视图必须使用INNER JOINS否则会引发错误。
答案 0 :(得分:0)
2013年5月发布的针对.NET4.5的Microsoft更新KB2805227(http://support.microsoft.com/kb/2805227)已解决此问题。卸载它解决了这个问题。
答案 1 :(得分:0)
你说得对,http://support.microsoft.com/kb/2805227就是要保持.net Framework 4.5和4.0之间的兼容性。应用它后,您将获得.Net FX 4.0生成的SQL。
.net FX 4.5行为是一些性能优化的结果,我们鼓励每个人都利用它(就像你正在做的那样)。要在应用KB后选择加入此行为,可以在web.config文件中设置httpRuntime元素的targetFramework属性,如下所示:
<system.web>
<httpRuntime targetFramework="4.5" />
如果您的应用程序是在.net framework 4.0上开发的,请注意设置此属性可能会触发其他行为更改。有关此属性的详细信息,您可以阅读此博客:http://blogs.msdn.com/b/webdev/archive/2012/11/19/all-about-httpruntime-targetframework.aspx
此外,如果您的应用程序是使用.NET framework 4.0构建的,则需要采取额外步骤让NuGet在.net framework 4.5的项目中包含正确版本的EntityFramework.dll程序集。最简单的方法是通过在Package Manage Console中键入“Update-Package -Reinstall”来更新所有包。如果由于某些原因不适合您或您想避免更新所有包,您可以从项目中手动卸载EntityFramework包和依赖它的所有包(例如Microsoft.AspNet.Membership.OpenAuth)并重新安装通过键入“Install-Package EntityFramework -Version 5.0.0”和任何依赖包来实现EntityFramework包。