我使用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 信息。
有什么建议吗?
答案 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的版本历史记录,以查看以下链接中每个版本的目标:
答案 4 :(得分:0)
此外,您还需要在启动项目的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>