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
相关产品推荐
相关产品推荐

