从 .net6 升级到 .net8:带配置的自定义上下文 - DB First

问题描述 投票:0回答:1

我想从 .net6 升级到 .net8。我必须使用数据库优先方法。 在 .net6 中,我创建了一个自定义上下文,以便能够从注入的配置传递连接字符串。

public partial class ScaffoldedCustomContext : ScaffoldedContext
{
    private IConfiguration _config;

    public ScaffoldedCustomContext(IConfiguration Configuration)
    {
        _config = Configuration;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer(_config.GetValue<string>("connectionString"));
        }
    }
}

“切换”到.net8(包升级并更改我的 VS 代码 launch.json)后,数据库脚手架创建以下上下文文件:

public partial class ScaffoldedContext : DbContext
{
    public ScaffoldedContext(DbContextOptions<ScaffoldedContext> options)
        : base(options)
    {
    }
    ...
}

在 .net6 中,我还获得了一个空的默认构造函数:

public ScaffoldedContext()
{
}

在我的一些方法中,例如在“Main”中,我需要创建一个像这样的上下文:

 var _context = new ScaffoldedCustomContext(Configuration);

但是使用 .net8 我收到错误消息,指出缺少所需的参数选项。

我该如何应对?我是否需要修改 ScaffoldedCustomContext 还是必须创建一个选项对象 - 如果是,如何?

谢谢你。

c# entity-framework-core .net-6.0 .net-8.0 scaffold
1个回答
0
投票
  1. 可以说你根本不需要

    ScaffoldedCustomContext
    课程。
    ScaffoldedContext
    生成为 partial 所以你应该能够创建一个名为
    ScaffoldedContext.Custom
    之类的文件并将其放置在生成的文件附近(确保将它们放置在同一命名空间中)并将所有自定义内容移至那里:

     public partial class ScaffoldedContext
     {
         private IConfiguration _config;
    
         public ScaffoldedContext(IConfiguration Configuration)
         {
             _config = Configuration;
         }
    
         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
         {
             if (!optionsBuilder.IsConfigured)
             {
                 optionsBuilder.UseSqlServer(_config.GetValue<string>("connectionString"));
             }
         }
     }
    
  2. 如果没有看到您的

    Main
    ,很难说出最好的行动方案是什么,但是

    • 根据设置,您可能只解析
      Main
      中的上下文 - 请参阅示例 无法从 ASP.NET Core 6 中的根提供程序解析作用域服务
    • 与之前类似 - 注册上下文工厂并解决它
    • 构造选项,这样您就不需要自定义构造函数:
      var options = new DbContextOptionsBuilder<ScaffoldedContext>()
          .UseSqlServer(Configuration.GetValue<string>("connectionString"))
          .Options;
      var ctx = new ScaffoldedContext(options);
      
© www.soinside.com 2019 - 2024. All rights reserved.