如何在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
相关产品推荐
相关产品推荐

