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

Uba*_*Uba 9 c# entity-framework-6

我知道EF6 EntityFramework.SqlServer存在问题,并包含 var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);在上下文构造函数中.我在DEBUG模式下发布时工作正常.

仅在我以RELEASE模式发布时才出现以下错误.原因EntityFramework.SqlServer.dll在已发布的文件夹中丢失.但是,bin文件夹具有EntityFramework.SqlServer.dll,用于调试和释放模式.

错误:

实体框架提供程序类型"System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer"在与固定名称"System.Data.SqlClient的" ADO.NET提供程序的应用程序配置文件中注册无法加载.确保使用了程序集限定名称,并且程序集可供正在运行的应用程序使用.

为什么只有在我使用RELEASE模式发布时它才会丢失?

Ahm*_*gdy 24

不知道为什么; 但是将此方法添加到您的上下文将使您的项目复制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;
        }
Run Code Online (Sandbox Code Playgroud)

测试和工作参考:无法加载实体框架提供程序类型?

  • 这有效..很可能是因为这个声明,entityframework.sqlserver 被“实际”使用了.. (2认同)

小智 5

我也有同样的问题。

\n\n

发生的情况是,这EntityFramework.SqlServer.dll不是由您的项目直接引用,而是由EntityFramework.dll.

\n\n

EntityFramework.SqlServer.dll由于我们在代码中没有使用任何这些组件,因此Roslyn编译器应用了一些优化,了解它不需要此组件,然后不会将其复制到该bin文件夹​​,也不会复制Publish.

\n\n

EntityFramework.SqlServer.dll您需要做的是在代码中的任何位置创建对 this 某个对象的引用。

\n\n

例如,我有一个依赖注入容器配置类,我在其中配置我的存储库和上下文,我认为这将是一个很好的位置。所以我创建了一个我从未在任何位置使用的静态属性,但它解决了问题:

\n\n
using System.Data.Entity.SqlServer;\n\npublic class ContainerConfiguration\n{\n    // HACK: This code snippet ensures that the DLL (EntityFramework.SqlServer.dll)\n\xc2\xa0\xc2\xa0\xc2\xa0 // not removed by compiler optimizer (csc.exe roslyn)\n    public static SqlProviderServices EntitySqlServerHack => SqlProviderServices.Instance;\n\n    public void ContainerConfiguration(IContainer container)\n    {\n        InternalConfigure(container, false);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n