无法加载实体框架提供程序类型'System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer'

Ali*_*khi 4 .net wcf entity-framework winforms

我使用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.

有什么建议?

Rez*_*aei 12

您不需要在客户端应用程序中安装EF6 NuGet包,该错误与客户端应用程序无关,因为客户端应用程序连接到WCF服务,即使存在数据库或数据访问层也不知道.

此错误与EntityFramework.SqlServer.dll服务库和/或主机项目的bin文件夹中缺少有关.

选项1

最简单的方法是在WCF主机项目中使用NuGet Package Manager安装EF6,如果以前安装过,请尝试卸载并再次安装.这种方式EntityFramework.SqlServer.dll输出直销.

请注意,这种方式是针对n层规则的,因为这个数据访问层上面的库依赖于EF6,这不是很好.

选项2

作为EntityFramework.SqlServer.dll在输出目录中复制的变通方法,请确保Copy Local将此dll设置为true,然后将此代码放在DbContext构造函数中:

var ensureDllIsCopied = System.Data.Entity.SqlServer.SqlProviderServices.Instance; 
Run Code Online (Sandbox Code Playgroud)

它确保EntityFramework.SqlServer.dll被复制到数据访问项目的cunsumers的输出目录.这是一种解决方法.

使用这种方式,您在数据访问层上方的层中不依赖于EF.


小智 8

许多人报告在使用 EF 6 和 Code First 时存在一个问题,即 EntityFramework.SqlServer 提供程序(或他们正在使用的其他提供程序)未在本地复制。这会导致以下错误:

System.InvalidOperationException:无法加载在具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序的应用程序配置文件中注册的实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices、EntityFramework.SqlServer” 。确保使用程序集限定名称并且该程序集可供运行的应用程序使用。有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=260882 。

仅当 EntityFramework NuGet 包未安装在启动项目中时才会发生这种情况(即仅安装在类库等中)

此问题并非实体框架特有的,而是 MSBuild 如何确定需要部署哪些程序集的副作用。出现此问题的原因是应用程序中没有显式引用 EntityFramework.SqlServer.dll(或相关提供程序程序集)中的类型的代码,因为 EF 将根据 App/Web.config 文件中的信息在运行时加载程序集。因此,MSBuild 不会检测到需要该程序集,并且不会将其复制到输出目录


Ali*_*khi 4

我通过在 WCF 主机站点中安装实体框架解决了这个问题。

那行得通。

  • 正如我在 **选项 1** 中所说,*最简单的方法是也在 WCF 主机项目中使用 NuGet 包管理器安装 EF6。* (3认同)