无法加载文件或程序集 EntityFramework。

17

我已经部署了一个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" />

我通过谷歌已经阅读了所有能找到的内容,但迄今为止没有什么帮助。我知道我用来构建应用程序的EF版本与部署机器上的版本不同,但我需要一些指导来纠正这种差异。


1
你的 bin 目录中是否有 EntityFramework dll? - Shyju
3
你似乎正在使用.NET Framework 4上的EF5(因此在你的配置文件中出现版本号4.4.0.0),但你得到的异常是关于EF 4.1的(版本为4.1.0.0)。看起来你仍在使用一些尝试使用4.1的程序集,而另一个则是EF5(4.4.0.0)。确保你在所有地方都引用相同的程序集。此外,配置文件中的条目只是指向一种类型,该类型知道如何读取配置节,因此仅更新这些内容不足以使应用程序使用EF5正常运行。 - Pawel
@Justin 抱歉,我不知道 GAC 是什么。 - Splendor
@Shyju 是的,我在bin文件夹中有EntityFramework.dll。 - Splendor
@Splendor:我把我的评论变成了答案。 - Pawel
显示剩余5条评论
6个回答

15
您似乎正在使用.NET Framework 4上的EF5(因此在您的配置文件中为4.4.0.0版本),但您得到的异常是关于EF4.1的(版本为4.1.0.0)。看起来有些组件仍然尝试使用4.1,而其他组件使用的是EF5(4.4.0.0)。请确保在所有地方引用相同的程序集。因此,您需要更新所有引用以使用EF5并重新构建项目。 顺便说一句,配置文件中的条目只是指向一个类型,知道如何读取配置节,因此更新此条目是不足以使应用程序针对EF5工作的。

6
您可以尝试以下步骤:
在解决方案资源管理器中,转到引用节点并找到EntityFramework引用节点,然后在其属性中将“特定版本”属性设置为False。
然后从您的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" />

以这种方式,与版本不匹配相关的错误应该会得到解决。
正如其他评论中所说,如果您从NuGet获取所有参考资料并将所有内容检入您的源代码控制系统中,则效果更佳。
这种方法已经在许多情况下为我工作过,而且在以后升级到EF的新版本时不需要对web.config进行任何更改。

1
具体版本已设置为false,不幸的是,在Web.config中更改建议的行并没有改变任何东西。 - Splendor

5

在进行所有引用的更新之前,尝试重新启动Visual Studio。这对我解决了问题。


0

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

我通过打开IIS Express选项并选择“停止站点”手动卸载了该站点。然后我就能正常进行了。


0

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


0
在我的情况下,有点不同。DLLs完全不存在于GlobalAssemblyCache中,并且未由VS部署。我必须将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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接