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

