只有当我以RELEASE模式发布时,EntityFramework.SqlServer.dll才会被添加到发布的文件夹中



我知道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.dllRoslyn编译器,应用一些优化,理解它不需要这个组件,然后不将其复制到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条目就可以了

听起来你的解决方案有问题。我会重新制作解决方案,并将所有文件复制到新的解决方案中。

最新更新