0

在一个 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,否则会引发错误。

4

2 回答 2

0

解决了 2013 年 5 月发布的针对 .NET4.5 的 Microsoft 更新 KB2805227 ( http://support.microsoft.com/kb/2805227 ) 对我造成了这个问题。卸载它解决了这个问题。

于 2013-05-16T09:30:44.787 回答
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 程序集。最简单的方法是通过在包管理控制台中键入“Update-Package –Reinstall”来更新所有包。如果由于某种原因对您不起作用或者您想避免更新所有包,您可以从项目中手动卸载 EntityFramework 包和所有依赖它的包(例如 Microsoft.AspNet.Membership.OpenAuth)并重新安装EntityFramework 包,通过键入“Install-Package EntityFramework -Version 5.0.0”和任何依赖包。

于 2013-05-21T23:49:12.623 回答