无法加载实体框架提供程序类型“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.config
或web.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”的主要内容,如果未能解决你的问题,请参考以下文章
为啥实体框架 6.1.3 抛出“无法加载类型‘System.Data.Entity.Infrastructure.TableExistenceChecker’”
无法加载具有不变名称“System.Data.SqlServerCe.4.0”的 ADO.NET 提供程序