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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:27:38