当我以发布模式发布时,EntityFramework.SqlServer.dll仅在发布文件夹中未被添加。

12
我知道EF6 EntityFramework.SqlServer存在问题,并在上下文构造函数中包含var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);。在DEBUG模式下发布时没有问题,但是在RELEASE模式下发布时会出现以下错误:由于发布文件夹缺少EntityFramework.SqlServer.dll而引起的错误。但是,对于调试和发布模式,bin文件夹中都有EntityFramework.SqlServer.dll。 错误信息为: "System.Data.SqlClient"不变的ADO.NET提供程序中,注册了实体框架提供程序类型"System.Data.Entity.SqlServer.SqlProviderServices,EntityFramework.SqlServer",但无法加载该提供程序。确保使用程序集限定名,并且该程序集可供运行的应用程序使用。 为什么只有在RELEASE模式下发布时它会消失?

1
在解决方案资源管理器中,选择对 EntityFramework.SqlServer.dll 的引用,并确保在 Release 配置中将其标记为“复制到输出”,然后与 Debug 进行比较。 - Dai
你确定调试和发布版本使用的是相同的数据库结构吗? - libik
@libik:是的,两者具有相同的结构。同时,已验证了调试和发布二进制文件夹。它包含EntityFramework.SqlServer.dll。 - Uba
@Dai:你是指复制到本地吗?因为我在EntityFramework.SqlServer.dll属性中没有找到“复制到输出”属性。 - Uba
将属性添加到您的程序集以引用EntityFramework.SqlServer。详情请参见https://dev59.com/InnZa4cB1Zd3GeqPp212#48318806。 - Pavel
4个回答

31

不知道为什么,但将此方法添加到您的上下文中将使您的项目复制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;
        }

测试并且工作正常。 参考: Entity Framework Provider type could not be loaded?


2
这个可以工作。很可能是因为这个语句,entityframework.sqlserver被“实际”使用了。 - TPG
问题已确认修复。 - Phillip Davis
你需要引用哪些程序集?我尝试添加了 System.Data 和 System.Data.Entity,但仍无法编译。 - Stealth Rabbi

4

我也遇到了同样的问题。

发生这种情况是因为你的项目没有直接引用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);
    }
}

0

添加缺失引用的另一种方法是直接在项目的.csproj文件中添加它。只需复制EntityFramework引用,删除publicKey条目即可。


-2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接