You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Entity Framework Core中配置多上下文并正常使用迁移命令?

解决多DbContext迁移失败的问题

核心问题定位

报错An exception was thrown while activating Jookli.Payments.Infrastructure.PaymentsContext的本质是:DI容器无法正确区分多个DbContext的依赖配置——你的DbContext构造函数使用了非泛型的DbContextOptions,当多个上下文同时注册时,DI无法匹配每个上下文对应的配置选项,导致激活失败。

具体修复步骤

1. 修改DbContext构造函数,使用泛型DbContextOptions

将每个DbContext的构造函数参数从非泛型DbContextOptions改为对应上下文的泛型DbContextOptions<TContext>,明确DI的注入对应关系:

以PaymentsContext为例:

public class PaymentsContext : DbContext
{
    // 实体DbSet保持不变
    public DbSet<OutboxMessage> OutboxMessages { get; set; }
    public DbSet<InternalCommand> InternalCommands { get; set; }
    public DbSet<InboxMessage> InboxMessage { get; set; }
    public DbSet<CardEntity> Cards { get; set; }
    public DbSet<UserEntity> Users { get; set; }

    private readonly ILoggerFactory _logger;
    // 替换为泛型DbContextOptions<PaymentsContext>
    public PaymentsContext(DbContextOptions<PaymentsContext> options, ILoggerFactory loggerFactory) : base(options)
    {
        _logger = loggerFactory;
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
        base.OnModelCreating(modelBuilder);
    }
}

对GamesContext和UserAccessContext执行相同修改,分别改为DbContextOptions<GamesContext>和DbContextOptions<UserAccessContext>。

2. 配置独立迁移历史表(可选但推荐)

由于所有DbContext共享同一数据库,为避免迁移历史记录冲突,给每个上下文指定独立的迁移历史表:

public void ConfigureServices(IServiceCollection services)
{
    // ... 其他服务注册保持不变

    services.AddDbContext<UserAccessContext>(options =>
    {
        options.UseSqlServer(_configuration[JookliConnectionString])
               .UseMigrationHistoryTable("__EFMigrationsHistory_UserAccess");
    });

    services.AddDbContext<GamesContext>(options =>
    {
        options.UseSqlServer(_configuration[JookliConnectionString])
               .UseMigrationHistoryTable("__EFMigrationsHistory_Games");
    });

    services.AddDbContext<PaymentsContext>(options =>
    {
        options.UseSqlServer(_configuration[JookliConnectionString])
               .UseMigrationHistoryTable("__EFMigrationsHistory_Payments");
    });
}

3. 明确迁移程序集(可选)

如果DbContext分布在不同程序集中,注册时指定迁移程序集,确保EF Core能找到对应迁移类:

services.AddDbContext<PaymentsContext>(options =>
{
    options.UseSqlServer(_configuration[JookliConnectionString],
        sql => sql.MigrationsAssembly(typeof(PaymentsContext).Assembly.FullName));
});

4. 正确执行迁移命令

确保命令中指定的Context名称与类名完全匹配,例如:

PM> Add-Migration InitialPaymentsSetup -Context PaymentsContext

验证

完成上述修改后,无需注释其他DbContext,直接执行迁移命令即可正常生成对应上下文的迁移文件。

内容的提问来源于stack exchange,提问作者Guinea Pig Taco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:35:21