我使用dotNet 4.5创建了一个WCF服务。数据库层使用Entity Framework 6构建。
我用IIS 8托管了这项服务。它工作正常。
现在我需要使用使用dotnet framework 3.5构建的Windows窗体客户端来使用该服务。
我可以成功创建服务引用。但是当我运行代码时,出现以下错误;
无法加载在具有不变名称“System.Data.SqlClient”的ADO.NET提供程序的应用程序配置文件中注册的实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer”。确保使用了程序集限定名称,并且程序集可供正在运行的应用程序使用。有关更多信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882。
有什么建议?
您不需要在客户端应用程序中安装EF6 NuGet包,该错误与客户端应用程序无关,因为客户端应用程序连接到WCF服务,即使存在数据库或数据访问层也不知道。
此错误与服务库和/或主机项目的bin文件夹中缺少EntityFramework.SqlServer.dll
有关。
选项1
最简单的方法是在WCF主机项目中使用NuGet Package Manager安装EF6,如果以前安装过,请尝试卸载并再次安装。这样EntityFramework.SqlServer.dll
输出directoories。
请注意,这种方式是针对n层规则的,因为这个数据访问层上面的库依赖于EF6,这不是很好。
选项2
作为在输出目录中复制EntityFramework.SqlServer.dll
的解决方法,请确保将此dll的Copy Local
设置为true
,然后将此代码放在DbContext
构造函数中:
var ensureDllIsCopied = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
它确保qazxsw poi被复制到数据访问项目的消费者的输出目录。这是一种解决方法。
使用这种方式,您在数据访问层上方的层中不依赖于EF。
我通过在WCF主机站点中安装实体框架来解决此问题。
那很有效。
很多时候,当您收到无法加载DLL的错误时,这是由于依赖性问题。
如果您尝试在客户端中使用或执行EF的任何部分,那么这可能是个问题。如果您的客户只使用POCO,那么您的客户端所针对的.NET版本无关紧要。
EF 6.1.3将安装在.NET 3.5项目中,但不会运行。支持.NET 3.5的唯一EF版本是v1。 EF 6及更高版本仅支持.NET 4和4.5。
有许多功能需要.NET 4及更高版本(例如异步)
您可以查看EF的版本历史记录,以查看以下链接中每个版本的目标:
EntityFramework.SqlServer.dll