EF6 中具有不同执行策略的多个 DbConfiguration

Posted

技术标签:

【中文标题】EF6 中具有不同执行策略的多个 DbConfiguration【英文标题】:Multiple DbConfigurations with different execution strategies in EF6 【发布时间】: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 的情况下设置执行策略,但我不确定它是否如此,以及我应该如何做到这一点。

【问题讨论】:

【参考方案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 DbConfigurations和SO 在问这个问题之前我已经看到了你链接的问题,我的问题是不同的,因为我需要 2 个不同的 DbConfigurations。我做了你建议的一切,但它中断了,因为我需要用于 Azure 数据库的 DbConfiguration 有一个不适合常规 Sql 数据库的执行策略。 @Martijn - 请检查更新后的答案

以上是关于EF6 中具有不同执行策略的多个 DbConfiguration的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 6 中具有多个记录集的存储过程

在 EF6 中,是不是可以使用每个调用结构的上下文跨服务调用执行事务?

在 MySQL Linq Query EF6 中使用多个 Include() 方法时出现 FormatException

具有多个非键列的继承连接策略

EF6 两个上下文与具有两个等待的单个上下文

具有多个共享列的 MySql 索引策略