.NET 6升级至.NET 8:DB First模式下自定义上下文配置问题
解决.NET 8 DB First模式下自定义上下文实例化错误的方案
核心原因
.NET 8的EF Core Scaffold工具生成的ScaffoldedContext不再包含无参构造函数,仅保留接收DbContextOptions<ScaffoldedContext>的构造函数。你的自定义上下文ScaffoldedCustomContext继承自它,原构造函数未传递父类所需的options参数,导致报错。
方案一:修改ScaffoldedCustomContext适配父类构造
方式1:依赖注入模式(推荐)
如果通过依赖注入容器使用上下文,调整自定义上下文的构造函数,同时接收父类所需的DbContextOptions和IConfiguration:
public partial class ScaffoldedCustomContext : ScaffoldedContext { private readonly IConfiguration _config; public ScaffoldedCustomContext(DbContextOptions<ScaffoldedContext> options, IConfiguration config) : base(options) { _config = config; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlServer(_config.GetValue<string>("connectionString")); } } }
在Program.cs中注册上下文:
builder.Services.AddDbContext<ScaffoldedCustomContext>(options => { options.UseSqlServer(builder.Configuration.GetValue<string>("connectionString")); });
后续通过依赖注入获取实例,而非手动new。
方式2:手动实例化适配
如果需要保持手动new的方式(比如Main方法中),修改自定义上下文构造函数,自行构建DbContextOptions并传递给父类:
public partial class ScaffoldedCustomContext : ScaffoldedContext { private readonly IConfiguration _config; public ScaffoldedCustomContext(IConfiguration config) : base(BuildOptions(config)) { _config = config; } private static DbContextOptions<ScaffoldedContext> BuildOptions(IConfiguration config) { var optionsBuilder = new DbContextOptionsBuilder<ScaffoldedContext>(); optionsBuilder.UseSqlServer(config.GetValue<string>("connectionString")); return optionsBuilder.Options; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlServer(_config.GetValue<string>("connectionString")); } } }
这样就能继续用原有方式创建实例:
var _context = new ScaffoldedCustomContext(Configuration);
方案二:直接构建DbContextOptions实例手动创建上下文
若不想修改自定义上下文,可手动构建DbContextOptions,但需确保自定义上下文有接收DbContextOptions和IConfiguration的构造函数:
// 构建options对象 var options = new DbContextOptionsBuilder<ScaffoldedContext>() .UseSqlServer(Configuration.GetValue<string>("connectionString")) .Options; // 创建上下文实例 var _context = new ScaffoldedCustomContext(options, Configuration);
注意事项
- 重新执行Scaffold命令生成
ScaffoldedContext时,不会覆盖你的自定义上下文类(因是partial类),修改操作安全。 - 优先采用依赖注入模式,符合.NET 8的最佳实践,能更合理地管理上下文生命周期。
内容的提问来源于stack exchange,提问作者ratanmalko
相关产品推荐
相关产品推荐

