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

如何将MyProjectsDatabaseOptions注入DbContext构造函数并生效?

解决方案

核心问题原因

EF Core 会优先调用无参构造函数,导致依赖注入的 IMyProjectsDatabaseOptions 无法生效。以下是具体修复步骤:


步骤1:移除ModelContext的无参构造函数

保留带依赖注入参数的构造函数即可,DI环境下不需要无参构造:

public partial class ModelContext : DbContext
{
    private readonly IMyProjectsDatabaseOptions _myProjectsDatabaseOptions;

    // 仅保留此构造函数
    public ModelContext(DbContextOptions<ModelContext> options, IMyProjectsDatabaseOptions myProjectsDatabaseOptions)
        : base(options)
    {
        _myProjectsDatabaseOptions = myProjectsDatabaseOptions;
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema(_myProjectsDatabaseOptions.Schema)
            .UseCollation("USING_NLS_COMP");
        
        // 原有其他OnModelCreating逻辑...
    }
}

步骤2:正确配置AddDbContext

需要在注册DbContext时,通过服务提供者获取IMyProjectsDatabaseOptions来配置连接字符串(替换为你实际使用的数据库驱动,比如SqlServer/Oracle等):

builder.Services.AddDbContext<ModelContext>((serviceProvider, optionsBuilder) =>
{
    var dbOptions = serviceProvider.GetRequiredService<IMyProjectsDatabaseOptions>();
    // 示例为Oracle,根据你的数据库类型调整
    optionsBuilder.UseOracle(dbOptions.ConnectionString);
}, ServiceLifetime.Scoped);

步骤3:确认服务注册与配置

确保IMyProjectsDatabaseOptions的注册正确,且配置文件(如appsettings.json)中存在对应配置:

{
  "Schema": "YourTargetSchema",
  "ConnectionStrings": {
    "MyProjects_YourTargetSchema": "你的数据库连接字符串"
  }
}

服务注册代码无需修改,保持原有即可:

builder.Services.AddSingleton<IMyProjectsDatabaseOptions, MyProjectsDatabaseOptions>();

备选应急方案(不推荐)

如果暂时无法移除无参构造,可以在OnConfiguring中手动获取依赖,但这种方式会额外创建服务提供者,不够优雅:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    if (!optionsBuilder.IsConfigured)
    {
        var tempServices = new ServiceCollection()
            .AddSingleton(builder.Configuration)
            .AddSingleton<IMyProjectsDatabaseOptions, MyProjectsDatabaseOptions>()
            .BuildServiceProvider();

        var dbOptions = tempServices.GetRequiredService<IMyProjectsDatabaseOptions>();
        optionsBuilder.UseOracle(dbOptions.ConnectionString);
        _myProjectsDatabaseOptions = dbOptions;
    }
}

内容的提问来源于stack exchange,提问作者Paul Sinnema

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:37:01