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

EF Core 8迁移需无参构造函数,如何访问Configuration获取连接字符串?

解决EF Core 8迁移时无法读取appsettings.json配置的问题

方案1:在DbContext的OnConfiguring中手动加载配置

不用添加无参构造,保留原有的依赖注入构造函数,同时在OnConfiguring里做兼容处理——当没有通过DI传入配置选项时(也就是PMC迁移的场景),手动构建配置读取appsettings.json:

public class PortalDbContext : DbContext
{
    private readonly IConfiguration _configuration;

    // 程序运行时依赖注入用的构造
    public PortalDbContext(DbContextOptions<PortalDbContext> options, IConfiguration configuration)
        : base(options)
    {
        _configuration = configuration;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // 只有当DI没配置过选项时,才手动加载配置
        if (!optionsBuilder.IsConfigured)
        {
            var configBuilder = new ConfigurationBuilder()
                // 定位到当前项目的根目录(确保能找到appsettings.json)
                .SetBasePath(Directory.GetCurrentDirectory())
                // 加载基础配置文件
                .AddJsonFile("appsettings.json")
                // 可选:加载对应环境的配置文件,比如开发/测试环境
                .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
                .Build();

            // 读取连接字符串并配置DbContext
            optionsBuilder.UseSqlServer(configBuilder.GetConnectionString("PortalDbConnection"));
        }
    }
}

这样不管是程序正常运行时的DI注入,还是PMC迁移时的手动加载,都能从配置文件拿连接字符串,不用硬编码。

方案2:使用设计时DbContext工厂(EF官方推荐)

创建一个专门的工厂类,实现IDesignTimeDbContextFactory<PortalDbContext>,PMC执行迁移时会自动调用这个工厂创建DbContext实例,完全不用修改原有的DbContext构造:

public class PortalDbContextFactory : IDesignTimeDbContextFactory<PortalDbContext>
{
    public PortalDbContext CreateDbContext(string[] args)
    {
        // 构建配置读取器
        var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
            .Build();

        // 配置DbContext选项
        var optionsBuilder = new DbContextOptionsBuilder<PortalDbContext>();
        optionsBuilder.UseSqlServer(config.GetConnectionString("PortalDbConnection"));

        // 用配置好的选项和配置实例创建DbContext
        return new PortalDbContext(optionsBuilder.Options, config);
    }
}

把这个工厂类放在DbContext所在的项目里就行,迁移时EF会自动识别它,这样就能正常读取appsettings.json的配置了。

额外注意点

  • 确保appsettings.json的复制到输出目录属性设置为「如果较新则复制」,不然编译后配置文件不在输出目录,迁移时读不到。
  • 要切换开发/测试环境的话,先在PMC里设置环境变量:$env:ASPNETCORE_ENVIRONMENT = "Development",再执行迁移命令,就会自动加载对应环境的配置文件。
  • 迁移命令示例:Add-Migration AddUserTable、Update-Database,记得把PMC的默认项目设为DbContext所在的项目。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:42:53