EF Core多DbContext依赖注入时连接串错误问题求助
问题根源
你的SourceDbContext构造函数依赖的是DbContextOptions<ApplicationDbContext>,而非DbContextOptions<SourceDbContext>。EF Core的依赖注入系统会根据构造函数中的泛型参数匹配对应的配置,这就导致SourceDbContext复用了ApplicationDbContext注册的DefaultConnection连接串,而非自己配置的PreviousConnection。
解决方案
需要修改子类DbContext的构造函数,使其使用自身泛型的DbContextOptions,并调整基类构造函数以兼容这种传递:
调整基类
ApplicationDbContext构造函数
将基类构造改为接受非泛型的DbContextOptions,让所有子类都能传递自己的配置:public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptions options) : base(options) { } // 你的DbSet定义和其他逻辑 public DbSet<EmailDomainWhiteList> EmailDomainWhiteLists { get; set; } }修改
SourceDbContext构造函数
改为使用DbContextOptions<SourceDbContext>,并传递给基类:public class SourceDbContext : ApplicationDbContext { public SourceDbContext(DbContextOptions<SourceDbContext> options) : base(options) { } }修改
TargetDbContext构造函数
同理使用自身泛型的DbContextOptions:public class TargetDbContext : ApplicationDbContext { public TargetDbContext(DbContextOptions<TargetDbContext> options) : base(options) { } }保留原服务注册配置
Program.cs中的注册代码无需修改,现在DI系统会正确为每个DbContext注入对应的连接串配置:builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")) .AddInterceptors(new PerformanceInterceptor())); builder.Services.AddDbContext<SourceDbContext>(options => options.UseNpgsql(builder.Configuration.GetConnectionString("PreviousConnection"))); builder.Services.AddDbContext<TargetDbContext>(options => options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));
验证
运行DataMigrationService后,控制台输出会显示SourceDbContext使用PreviousConnection,TargetDbContext使用DefaultConnection,数据迁移将按预期在两个数据库间执行。
内容的提问来源于stack exchange,提问作者Korpin

