我知道EF6 EntityFramework有问题。并在上下文构造函数中包含var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
。当我在DEBUG模式下发布时,它可以正常工作。
只有在发布模式下发布时才会出现以下错误。原因是发布文件夹中缺少EntityFramework.SqlServer.dll
。但是,bin文件夹中有用于调试和发布模式的EntityFramework.SqlServer.dll。
实体框架提供程序类型"System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework。在应用程序配置文件中注册的SqlServer'为ADO。具有不变名称"System.Data.SqlClient"的。NET提供程序无法加载。确保程序集限定名称为已使用,并且程序集对正在运行的应用程序可用。
为什么只有当我使用RELEASE模式发布时才会丢失?
不知道为什么;但是将此方法添加到您的上下文中将使您的项目复制dll
private void FixEfProviderServicesProblem()
{
// The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'
// for the 'System.Data.SqlClient' ADO.NET provider could not be loaded.
// Make sure the provider assembly is available to the running application.
// See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.
var instance = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
}
已测试并正常工作无法加载实体框架提供程序类型?
我也有同样的问题。
发生的是这个EntityFramework.SqlServer.dll
不是直接由您的项目引用,而是由EntityFramework.dll
内部引用。
由于我们在代码中没有使用任何EntityFramework.SqlServer.dll
, Roslyn编译器,应用一些优化,理解它不需要这个组件,然后不将其复制到bin
文件夹,也不复制Publish
。
你需要做的是在代码的任何地方创建一个对这个EntityFramework.SqlServer.dll
的某个对象的引用。
例如,我有一个依赖注入容器配置类,我在其中配置我的存储库和上下文,我认为这将是一个很好的位置。所以我创建了一个静态属性,我从来没有在任何位置使用过,但它解决了这个问题:
using System.Data.Entity.SqlServer;
public class ContainerConfiguration
{
// HACK: This code snippet ensures that the DLL (EntityFramework.SqlServer.dll)
// not removed by compiler optimizer (csc.exe roslyn)
public static SqlProviderServices EntitySqlServerHack => SqlProviderServices.Instance;
public void ContainerConfiguration(IContainer container)
{
InternalConfigure(container, false);
}
}
添加缺失引用的另一种方法是将其直接添加到项目的.csproj文件中。只需要复制EntityFramework引用,删除publicKey条目就可以了
听起来你的解决方案有问题。我会重新制作解决方案,并将所有文件复制到新的解决方案中。