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

EF Core多DbContext依赖注入时连接串错误问题求助

解决EF Core中继承DbContext的连接串混用问题

问题根源

你的SourceDbContext构造函数依赖的是DbContextOptions<ApplicationDbContext>,而非DbContextOptions<SourceDbContext>。EF Core的依赖注入系统会根据构造函数中的泛型参数匹配对应的配置,这就导致SourceDbContext复用了ApplicationDbContext注册的DefaultConnection连接串,而非自己配置的PreviousConnection。

解决方案

需要修改子类DbContext的构造函数,使其使用自身泛型的DbContextOptions,并调整基类构造函数以兼容这种传递:

  1. 调整基类ApplicationDbContext构造函数
    将基类构造改为接受非泛型的DbContextOptions,让所有子类都能传递自己的配置:

    public class ApplicationDbContext : DbContext
    {
        public ApplicationDbContext(DbContextOptions options) : base(options)
        {
        }
    
        // 你的DbSet定义和其他逻辑
        public DbSet<EmailDomainWhiteList> EmailDomainWhiteLists { get; set; }
    }
    
  2. 修改SourceDbContext构造函数
    改为使用DbContextOptions<SourceDbContext>,并传递给基类:

    public class SourceDbContext : ApplicationDbContext
    {
        public SourceDbContext(DbContextOptions<SourceDbContext> options)
            : base(options)
        {
        }
    }
    
  3. 修改TargetDbContext构造函数
    同理使用自身泛型的DbContextOptions:

    public class TargetDbContext : ApplicationDbContext
    {
        public TargetDbContext(DbContextOptions<TargetDbContext> options)
            : base(options)
        {
        }
    }
    
  4. 保留原服务注册配置
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:37:33