我正在尝试使用PostgresSQL和Entity框架使用WebAPI配置ASP.NET 4.5。我发现Postgres驱动程序Npgsql有两个独立的版本。版本2.0.12.0支持EF 5.0.0.0。有一个单独的版本(根据文档错误标记为2.0.13.91)支持EF 6.0.0.0。我不关心我使用哪个版本,只要我能让它正常工作。我尝试使用EF 6.0.0.0时遇到错误,我目前正试图让5.0.0.0正常工作(6.0.0.0中的错误是一个单独的问题,如有必要,我会单独发布)。
现在的问题显然是因为我已经安装了EF 6.0.0.0,我无法完全降级到EF 5.0.0.0。我已经恢复了我可以找到的所有引用,并且我只安装了EF 5.0.0.0,但是当我部署Web API应用程序或尝试执行使用Npgsql驱动程序的代码时,我得到:
A first chance exception of type 'System.IO.FileLoadException' occurred in System.Data.Entity.dll
A first chance exception of type 'System.IO.FileLoadException' occurred in EntityFramework.dll
iisexpress.exe Error: 0 : Operation=ReflectedHttpActionDescriptor.ExecuteAsync, Exception=System.IO.FileLoadException: Could not load file or assembly 'EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
at Npgsql.NpgsqlFactory.GetService(Type serviceType)
at System.Data.Common.DbProviderServices.GetProviderServices(DbProviderFactory factory)
我不知道6.0.0.0的规范来自哪里。我更新了web.config
中的所有版本规范。我已卸载并重新安装5.0.0.0。我甚至卸载并重新安装了MVC4的Visual Studio更新包。 Nuget中列出的EntityFramework包是5.0.0.0。包中的所有引用程序集都指定EF 5.0.0.0。我重建了Npgsql并使用Npgsql.dll
注册了重建的Mono.Security.dll
和gacutil.exe
。什么指向6.0.0.0以及如何还原它?
TL; DR
找到的程序集是5.0.0.0,这是正确的。由于某种原因,它正在寻找6.0.0.0,我无法弄清楚原因。
答案 0 :(得分:1)
我遇到了同样的问题,幸运的是,在我意外升级(以及随后降级)到EF6之前,在另一台服务器上部署了测试版本。所以,我从该服务器中提取配置文件,并且只能覆盖导致问题的配置。一旦我开始工作,我就将服务器上的版本与本地的版本区分开来,并注意到我的机器上的提供程序部分不在服务器上(参见服务器)下面)。一旦删除它,它对我有用。不清楚它是否仅仅是降级没有完成清理的情况。
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<!-- This providers section appeared after the accidental upgrade to EF6 once it was removed, application no longer expected EF6 dlls -->
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
我正处于部署过程中,所以对这个答案表示道歉只是轶事。希望这对你有用!