【问题标题】:Could not load file or assembly EntityFramework无法加载文件或程序集 EntityFramework
【发布时间】:2013-06-03 21:04:40
【问题描述】:

我已经部署了一个 ASP.NET MVC 4 应用程序并且主页加载正常,但是当我尝试访问任何其他页面(都尝试连接到 SQL 数据库)时,我收到此错误:

无法加载文件或程序集 'EntityFramework, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 或其依赖项之一。 找到的程序集的清单定义与程序集引用不匹配. (来自 HRESULT 的异常:0x80131040) 说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.IO.FileLoadException:无法加载文件或程序集“EntityFramework,Version=4.1.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)

我检查了 Web.config 文件,其中包含以下相关条目:

<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
...
<compilation targetFramework="4.0" />

我已经阅读了通过 Google 可以找到的所有内容,但到目前为止没有任何帮助。我知道我构建应用程序的 EF 版本与部署机器上的版本不同,但我可以使用一些方向来纠正这种差异。

【问题讨论】:

  • 不能把EF库推送到服务器吗?服务器上的 GAC 中有 EF 吗?
  • 您的 bin 目录中有 EntityFramework dll 吗?
  • 您似乎在 .NET Framework 4 上使用 EF5(因此配置文件中的版本为 4.4.0.0),但您得到的例外是 EF 4.1(版本为 4.1.0.0)。您正在使用的某些程序集似乎仍在尝试使用 4.1,而其他 EF5 (4.4.0.0)。确保在任何地方都引用相同的程序集。此外,配置文件中的条目只是将 .NET Framework 指向一个知道如何读取配置部分的类型,因此仅更新它以使应用程序针对 EF5 工作是不够的
  • @Justin 抱歉,我不知道 GAC 是什么。
  • @Shyju 是的,我的 bin 文件夹中有 EntityFramework.dll。

标签: c# asp.net-mvc entity-framework


【解决方案1】:

您似乎在 .NET Framework 4 上使用 EF5(因此配置文件中的版本为 4.4.0.0),但您得到的例外是 EF 4.1(版本为 4.1.0.0)。您正在使用的某些程序集似乎仍在尝试使用 4.1,而其他 EF5 (4.4.0.0)。确保在任何地方都引用相同的程序集。因此,您需要更新所有引用以使用 EF5 并重建项目。 顺便提一句。配置文件中的条目只是将 .NET Framework 指向一个知道如何读取配置部分的类型,因此仅更新它以使应用程序针对 EF5 工作是不够的

【讨论】:

    【解决方案2】:

    您可以尝试以下方法:

    在解决方案资源管理器中转到参考节点并找到EntityFramework 参考节点,然后在其属性中设置为False 属性Specific Version

    然后从您的web.config 中删除版本标识符,替换:

    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    

    简单地说:

    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework" requirePermission="false" />
    

    这样应该可以解决与版本不匹配有关的错误。

    仍然像 cmets 中的其他人所说的那样,如果您从 NuGet 获取所有引用并将所有内容签入源代码控制系统中,那就太好了。

    这种方法对我来说已经很多次了,并且在以后升级到更新版本的 EF 时不需要对 web.config 进行任何更改。

    【讨论】:

    • 特定版本已设置为 false,不幸的是,更改 Web.config 中的建议行并没有改变任何内容。
    【解决方案3】:

    在体验更新所有引用的乐趣之前,请尝试重新启动 Visual Studio。这为我解决了这个问题。

    【讨论】:

      【解决方案4】:

      我在尝试在 IIS Express 上本地调试项目时遇到了这个问题。

      我通过打开 IIS Express 选项并选择 Stop Site 手动卸载了该站点。然后我就可以正常进行了。

      【讨论】:

        【解决方案5】:

        就我而言,它有点不同。 GlobalAssemblyCache 中完全缺少 DLL,并且 VS 未部署这些 DLL。我必须将 EntityFramework.dll 和 EntityFramework.SqlServer.dll 部署到 GAC,因此使用以下 Powershell 脚本的 GAC 部署有效:

        [System.Reflection.Assembly]::Load("System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")            
        $publish = New-Object System.EnterpriseServices.Internal.Publish            
        $publish.GacInstall("C:\Path_To_DLL\EntityFramework.dll")
        $publish.GacInstall("C:\Path_To_DLL\EntityFramework.SqlServer.dll")
        

        【讨论】:

          【解决方案6】:

          如果您的项目名称与您引用的 nuget 包冲突,则可能会发生这种情况。在我意识到发生了什么之前,我浪费了大约 3 个小时。 因此,请避免输入与参考名称相同的名称

          【讨论】:

            猜你喜欢
            • 2020-05-04
            • 1970-01-01
            • 1970-01-01
            • 2015-12-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-10
            • 2012-09-27
            相关资源
            最近更新 更多