我已经部署了一个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版本与部署机器上的版本不同,但我可以使用一些方法来纠正这种差异。
答案 0 :(得分:15)
您似乎在.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
是不够的答案 1 :(得分:4)
您可以尝试以下方法:
解决方案资源管理器中的转到引用节点并找到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" />
以这种方式解决与不匹配版本相关的错误。
仍然像评论中所说的那样,如果您从NuGet获得所有参考资料并在您的源代码管理系统中签入所有内容,那就太好了。
对于许多组件,这种方法对我有用很多次,并且在以后升级到更新版本的EF时不需要对web.config进行任何更改。
答案 2 :(得分:1)
在完成更新所有引用的乐趣之前,请尝试重新启动Visual Studio。这解决了我的问题。
答案 3 :(得分:0)
我在尝试在IIS Express上本地调试项目时遇到了这个问题。
我通过打开IIS Express选项并选择Stop Site
手动卸载该站点。然后我就能正常进行了。
答案 4 :(得分:0)
就我而言,这有点不同。 DLL在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")
答案 5 :(得分:0)
如果您的项目名称与您引用的nuget包冲突,则会发生这种情况。我浪费了大约3个小时才意识到发生了什么事。 因此,请避免输入与参考名称相同的名称