【问题标题】:Multiple DbConfigurations with different execution strategies in EF6EF6 中具有不同执行策略的多个 DbConfiguration
【发布时间】:2021-12-11 20:35:46
【问题描述】:

我们使用 EF6 连接 Azure 数据库已有一段时间了。对于此数据库,我们使用特定于 Azure 连接的 ExecutionStrategy 来获得更具弹性的连接:

public class MyDbConfiguration : DbConfiguration
{
    public MyDbConfiguration()
    {
        SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
    }
}

更多信息请见the microsoft article about connection resilience

然而,最近我们添加了一个到另一个数据库的连接,该数据库驻留在我们想要使用默认执行策略的 MSSQL 数据库服务器上。由于这在同一个应用程序域中运行,我们遇到了一个问题:

在发现“MyDbConfiguration”类型之前,实体框架使用了默认 DbConfiguration 实例。在使用任何实体框架功能之前,必须在应用程序启动时设置“MyDbConfiguration”实例,或者必须在应用程序的配置文件中注册。请参阅http://go.microsoft.com/fwlink/?LinkId=260883 了解更多信息。”

查看错误中链接的文章我看到以下声明:

只为您的应用程序创建一个 DbConfiguration 类。此类指定应用程序域范围的设置。

我已经尝试了几个相关问题的解决方案,但我一直遇到同样的问题。我尝试过的事情基本上归结为通过代码、属性或配置文件以不同的方式设置自定义 DbConfiguration。

我认为解决方案是在不使用自定义 DbConfiguration 的情况下设置执行策略,但我不确定它是否如此,以及我应该如何做到这一点。

【问题讨论】:

    标签: c# entity-framework entity-framework-6 azure-sql-database


    【解决方案1】:

    实体框架使用了默认的 DbConfiguration 实例 在发现“MyDbConfiguration”类型之前。一个实例 'MyDbConfiguration' 必须在应用程序启动时设置,然后才能使用任何 实体框架功能或必须在应用程序的 配置文件。

    DbConfigurationTypeAttribute 放在您的上下文类中。

    如下改变上下文类:

    [DbConfigurationType("MyNamespace.MyDbConfiguration, MyAssembly")] 
    public class MyContextContext : DbContext
    { 
    }
    

    只为您的应用程序创建一个 DbConfiguration 类。这节课 指定应用程序域范围的设置。

    确保您在配置文件中添加了 sql 数据提供程序:

    使用配置文件指定DbConfiguration 实例。

    为此,请在 (web.config) 中设置 entityFramework 部分的 codeConfigurationType 属性。

    <entityFramework codeConfigurationType="MyNamespace.MyDbConfiguration, MyAssembly">
        ...Your EF config...
    </entityFramework>
    

    更新答案

    使用此处详述的解决方法:
    Entity Framework Limitations with Retrying Execution Strategies (EF6 onwards)

    或者 覆盖 DbConfiguration 或在此处使用不同 DbConfiguration 的技术之一: Entity Framework Code-Based Configuration (EF6 onwards)

    【讨论】:

    • 我对此有 3 个问题: 1. 这仍然会为所有 DbContexts 设置一个 DbConfiguration 对吗?这意味着这不会解决我的问题。 2. 为什么继承自 IdentityDbContext?这看起来像是来自 ASP.NET 的东西,我没有在这段代码中使用它。 3. microsoftthis article 中的文档指出,配置将优先于基于代码的配置。这是否意味着该属性是多余的?
    • 更新了答案。请参考Multiple DbContexts and DbConfigurationsSO
    • 在问这个问题之前我已经看到了你链接的问题,我的问题是不同的,因为我需要 2 个不同的 DbConfigurations。我做了你建议的一切,但它中断了,因为我需要用于 Azure 数据库的 DbConfiguration 有一个不适合常规 Sql 数据库的执行策略。
    • @Martijn - 请检查更新后的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    相关资源
    最近更新 更多