提问者:小点点

为同一模型创建两个EF上下文


我有一个app和两个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.DBContextToptions”1[StockApp.DataModels.MyDbContext]“的服务。

我的问题是:这是正确的做法吗?我错过了什么?


共1个答案

匿名用户

这个

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

应该是

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