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

11
我使用dotNet 4.5创建了一个WCF服务。数据库层是使用Entity Framework 6构建的。
我使用IIS 8托管了该服务,它运行良好。
现在我需要使用使用dotnet framework 3.5构建的Windows窗体客户端来消费该服务。
我可以成功创建服务引用。但是当我运行代码时,出现以下错误:
“在应用程序配置文件中注册的ADO.NET提供程序的Entity Framework提供程序类型'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer',其不变名称为'System.Data.SqlClient',无法加载。确保使用程序集限定名称并且程序集可供正在运行的应用程序使用。有关更多信息,请参见http://go.microsoft.com/fwlink/?LinkId=260882。”
有什么建议吗?

DataAccessLayer是否在与服务层不同的项目中?您是否已经在WCF项目上安装了EF 6包?这似乎与.NET 3.5或客户端无关,而是与服务器有关。 - Reza Aghaei
是的,有多个项目。首先,有WCF库,它也安装了Entity Framework 6。然后有一个WCF主机应用程序,在IIS中托管服务。然后有一个基于dotNet 3.5的Windows窗体项目。在Windows窗体项目中没有安装Entity Framework。 - Ali Sakhi
5个回答

28

在客户端应用程序中不需要安装 EF6 NuGet Package,因为该错误与客户端应用程序无关,因为客户端应用程序连接到 WCF 服务,甚至不知道数据库或数据访问层是否存在。

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

选项 1

最简单的方法是在 WCF 主机项目中使用 NuGet 包管理器安装 EF6,如果已经安装,请尝试卸载并重新安装。这样可以将 EntityFramework.SqlServer.dll 输出到目标目录。

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

选项 2

作为将 EntityFramework.SqlServer.dll 复制到输出目录的解决方法,请确保将此 dll 的 Copy Local 设置为 true,然后将以下代码放入您的DbContext 构造函数中:

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

它确保EntityFramework.SqlServer.dll被复制到数据访问项目的使用者输出目录中。这是一个解决方法。

通过这种方式,您的数据访问层上面的层不需要依赖于EF。


8

有一些人在使用EF6 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包未安装在启动项目中(即仅安装在类库等中)时才会出现此问题。

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


4

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

那样做起作用了。


3
正如我在“选项1”中所说,最简单的方法是在您的WCF主机项目中使用NuGet软件包管理器安装EF6。 - Reza Aghaei

0

很多时候,当您收到一个dll无法加载的错误时,这是由于依赖问题引起的。

如果您正在尝试在客户端中使用或执行EF的任何部分,则可能会出现此问题。如果您的客户端仅使用POCO,则客户端针对的.NET版本不重要。

EF 6.1.3将安装在您的.NET 3.5项目中,但它将无法运行。支持.NET 3.5的唯一版本是v1。EF 6及以上版本仅支持.NET 4和4.5。

有许多功能需要.NET 4及以上版本(例如async)

您可以在下面的链接中查看EF的版本历史记录以了解每个版本的目标:

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


我认为客户端应用程序完全独立于EF,因为服务是部署在IIS上,而Windows窗体应用程序运行在另一台机器上,即客户端机器,并将调用WCF服务。 - Reza Aghaei

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接