【问题标题】:Create two EF contexts for the same model为同一模型创建两个 EF 上下文
【发布时间】:2021-07-03 10:14:43
【问题描述】:

我有一个应用程序与两个 MySQL 数据库交互,其中一个是副本。当我需要执行事务时,我使用主数据库,当我需要访问一些历史数据或执行一些更昂贵的选择时,我使用从数据库。

我尝试了以下方法:

public class MyDbContext : IdentityDbContext<ApplicationUser>
{
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
    }

    public DbSet<Order> Orders { get; set; }
    public DbSet<Customer> Customers { get; set; }
    //...

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.EnableSensitiveDataLogging();
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        //...
    }
}

public class MyMainDbContext : MyDbContext
{
    public MyMainDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
    }
}

public class MyReplicationDbContext : MyDbContext
{
    public MyReplicationDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
    }
}

Startup.cs 我配置了以下服务:

public void ConfigureServices(IServiceCollection services)
{
        services.AddDbContext<MyMainDbContext>(options =>
            options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));

        services.AddDbContext<MyReplicationDbContext>(options =>
            options.UseMySql(Configuration.GetConnectionString("ReplicationConnection")));

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<MyMainDbContext>()
            .AddDefaultTokenProviders();

        services.Configure<IdentityOptions>(options =>
        {
            // Password settings
        });
        //...
}

我会像这样使用这两个上下文:

public class StockController : Controller
{
    private readonly MyMainDbContext _context;

    public StockController(MyMainDbContext context)
    {
        _context = context;
    }
    
    public async Task<IActionResult> Index()
    {
        //I only need MyMainDbContext here
    }
    
    public async Task<IActionResult> LastMonthsAverageStock([FromServices] MyReplicationDbContext replicationContext)
    {
        //I need MyReplicationDbContext here, it's an expensive query and fresh data is not important
    }
}

我收到以下异常:

InvalidOperationException:尝试激活“StockApp.DataModels.MyMainDbContext”时,无法解析“Microsoft.EntityFrameworkCore.DbContextOptions`1[StockApp.DataModels.MyDbContext]”类型的服务。

我的问题:这是解决这个问题的正确方法吗?我错过了什么?

【问题讨论】:

    标签: c# mysql asp.net-core .net-core entity-framework-core


    【解决方案1】:

    你必须创建 2 个构造函数:

    public class MyDbContext : IdentityDbContext<ApplicationUser>
    {
     public MyDbContext()
     {
     }
        public MyDbContext(DbContextOptions<MyMainDbContext> options) : base(options)
        {
        }
    
       public MyDbContext(DbContextOptions<MyReplicationDbContext> options) : base(options)
        {
        }
       
    }
    
    public class MyMainDbContext : MyDbContext
    {
        public MyMainDbContext(DbContextOptions<MyMainDbContext> options) : base(options)
        {
        }
    }
    
    public class MyReplicationDbContext : MyDbContext
    {
        public MyReplicationDbContext(DbContextOptions<MyReplicationDbContext> options) : base(options)
        {
        }
    }
    

    启动:

    services.AddDbContext<MyMainDbContext>(options => options.MySql(Configuration.GetConnectionString("DefaultConnection")));
    
    services.AddDbContext<MyReplicationDbContext>(options => options.MySql(Configuration.GetConnectionString("ReplicationConnection")));
    

    【讨论】:

    • 这行得通,谢谢:)。不过,空的构造函数不是必需的。
    • 谢谢。 No Empty 构造函数有时会导致错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 2016-10-29
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多