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

时间:2015-09-16 11:47:00

标签: .net winforms entity-framework wcf

我使用dotNet 4.5创建了一个WCF服务。数据库层使用Entity Framework 6构建。

我使用IIS 8托管了该服务。它运行正常。

现在我需要使用使用dotnet framework 3.5构建的Windows窗体客户端来使用该服务。

我可以成功创建服务引用。但是当我运行代码时,出现以下错误;

  

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

有什么建议吗?

5 个答案:

答案 0 :(得分:11)

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

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

选项1

最简单的方法是在WCF主机项目中使用NuGet Package Manager安装EF6,如果之前已经安装过,请尝试卸载并重新安装。这样EntityFramework.SqlServer.dll就可以输出编号了。

请注意,这种方式在某种程度上违反了n层规则,因为您的数据访问层上面的库依赖于EF6,这不是很好。

选项2

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

var ensureDllIsCopied = System.Data.Entity.SqlServer.SqlProviderServices.Instance; 

确保将EntityFramework.SqlServer.dll复制到数据访问项目的传播者的输出目录中。这是一种解决方法。

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

答案 1 :(得分:2)

存在一个问题,当在未在本地复制EntityFramework.SqlServer提供程序(或他们使用的另一个提供程序)的情况下,将带有代码优先功能的EF 6与EF 6一起使用时,有很多人报告。这会导致以下错误:

System.InvalidOperationException:实体框架提供程序类型'System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer'已在ADO.NET提供程序的应用程序配置文件中注册,名称不变为'System.Data。无法加载SqlClient。确保使用了程序集限定名称,并且该程序集可用于正在运行的应用程序。有关更多信息,请参见http://go.microsoft.com/fwlink/?LinkId=260882

仅当在启动项目中未安装EntityFramework NuGet软件包时(即仅在类库中安装此类)时才会发生

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

答案 2 :(得分:1)

我通过在WCF主机站点中安装实体框架来修复此问题。

那很有效。

答案 3 :(得分:0)

很多时候,当你收到一个无法加载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的版本历史记录,以查看以下链接中每个版本的目标:

https://msdn.microsoft.com/en-us/data/jj574253

答案 4 :(得分:0)

此外,您还需要在启动项目的app.configweb.config中使用它:

  <configSections>
  <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <connectionStrings>
    <add name="MyDbContext" connectionString="data source=localhost;initial catalog=MyDatabase;persist security info=True;user id=sa;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
  </connectionStrings>