EF Core 8 在管理迁移时需要默认 DbContext 构造函数,因此无法访问配置

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

我将 .NET 和 EF 项目从 5 升级到 8,并立即遇到了管理迁移的问题(我使用包管理器控制台)。

以前,我有以下 DbContext 类:

public class PortalDbContext : DbContext {

    private readonly IConfiguration _config;

    public PortalDbContext(
        DbContextOptions<PortalDbContext> options,
        IConfiguration config) : base(options) {

        _config = config;
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder) {
        //... assorted entity defs

        base.OnModelCreating(modelBuilder);
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
        if(!optionsBuilder.IsConfigured) {
            optionsBuilder.UseSqlServer(_config.GetConnectionString("PortalDBConnection"));
        }
    }   
}

升级到 8 后,我必须为 EF 添加一个默认的无参数构造函数才能管理迁移(添加、更新等),否则会抛出无法解析服务错误。

public PortalDbContext() {}

但是因为它没有使用带有配置参数的自定义构造函数,所以我无法在 OnConfiguring 调用中使用 GetConnection String。

我通过直接在 UseSqlServer 调用中输入连接字符串来克服它

if(!optionsBuilder.IsConfigured) {
    optionsBuilder.UseSqlServer("server=xxxxx, etc.");
}

但我真的希望能够在 appsettings.json 文件中单独定义配置字符串,因为我经常交换到不同的数据库进行开发和测试。

有没有办法让 EF 在管理迁移时可以访问配置?

请注意,我使用包管理器控制台作为 CLI,并将默认项目设置为包含 DbContext 类的项目。

另外,我在启动时有以下内容,但在 PMC 控制台中管理迁移时没有使用:

services.AddDbContext<PortalDbContext>(options =>                
     options.UseSqlServer(_config.GetConnectionString("PortalDBConnection")));
c# visual-studio entity-framework .net-core
1个回答
0
投票

当然,在我发布问题后,我立即找到了答案(感谢 Chat GPT)。需要在 OnConfiguring 调用中设置指向 appsettings.json 的配置:

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {

        if(!optionsBuilder.IsConfigured) {

            var configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();

            optionsBuilder.UseSqlServer(configuration.GetConnectionString("PortalDBConnection"));
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.