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

Posted

技术标签:

【中文标题】无法加载实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer”【英文标题】:The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' could not be loaded 【发布时间】:2015-12-12 23:44:21 【问题描述】:

我使用 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 信息。

有什么建议吗?

【问题讨论】:

DataAccessLayer 与您的服务层在不同的项目中吗?您是否在 WCF 项目上安装了 EF 6 包? - 好像和.net 3.5或者client没有关系,好像和server有关。 是的,有多个项目。首先是 WCF 库,它还安装了实体框架 6。然后有一个 WCF 主机应用程序,它在 IIS 中托管服务。然后在dotNet 3.5中有一个windows forms项目。 windows窗体项目中没有安装实体框架。 【参考方案1】:

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

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

选项 1

最简单的方法是在你的 WCF Host 项目中也使用 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 没有任何依赖。

【讨论】:

【参考方案2】:

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

成功了。

【讨论】:

正如我在 选项 1 中所说的那样 最简单的方法是在 WCF 主机项目中也使用 NuGet 包管理器安装 EF6。【参考方案3】:

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

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

只有在启动项目中没有安装EntityFramework NuGet包时才会发生这种情况(即它只安装在类库等中)

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

【讨论】:

【参考方案4】:

很多时候你得到一个 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

【讨论】:

我认为客户端应用程序完全独立于 EF,因为服务部署在 IIS 上,而 Windows 窗体应用程序运行在另一台机器上,即客户端机器上并会调用 WCF 服务。【参考方案5】:

您还需要在您的启动项目的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>

【讨论】:

以上是关于无法加载实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer”的主要内容,如果未能解决你的问题,请参考以下文章

带有 MySQL 的实体框架

为啥实体框架 6.1.3 抛出“无法加载类型‘System.Data.Entity.Infrastructure.TableExistenceChecker’”

无法加载具有不变名称“System.Data.SqlServerCe.4.0”的 ADO.NET 提供程序

实体框架探查器 - 带有 EF 6 的 ASP.NET MVC4 - 无法确定提供程序名称

无法加载 DLL 'sni.dll' - 实体框架核心

创建实体框架核心值转换器:属性“备注”属于“字符串”类型,当前数据库提供程序不支持