ASP.NET Core MVC 6.0 LTS配置无法从secrets.json读取连接串迁移报错问题
问题原因
EF Core 的包管理器控制台(PMC)迁移命令默认不会自动加载项目的用户机密(secrets.json),仅会读取 appsettings.json 中的配置,因此拿到的是空字符串,触发空值报错。
而通过 IIS Express 启动时,默认运行在开发环境,ASP.NET Core 会自动加载用户机密配置,所以可以正常读取连接串执行迁移。
解决方案
方案1:指定启动项目执行迁移(推荐,无需修改代码)
- 首先确认PMC顶部的「默认项目」下拉框选中的是你的
ApplicationDbContext所在的项目 - 执行迁移命令时追加启动项目参数,示例如下:
Add-Migration 你的迁移名称 -StartupProject 你的Web项目名称
执行数据库更新命令同理:
Update-Database -StartupProject 你的Web项目名称
指定启动项目后,EF 工具会自动加载启动项目的完整配置,包括开发环境的用户机密。
方案2:添加设计时DbContext工厂(适合频繁执行迁移的场景)
在项目中添加如下设计时工厂类,EF 工具执行迁移时会自动调用该类创建上下文,自动加载用户机密:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; using System.IO; namespace 你的项目实际命名空间 { public class ApplicationDbContextFactory : IDesignTimeDbContextFactory<ApplicationDbContext> { public ApplicationDbContext CreateDbContext(string[] args) { IConfigurationRoot configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .AddUserSecrets<Program>() // 加载用户机密的核心配置 .Build(); var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>(); var connectionString = configuration.GetConnectionString("DefaultConnection"); optionsBuilder.UseSqlServer(connectionString); return new ApplicationDbContext(optionsBuilder.Options); } } }
添加完成后直接执行 Add-Migration 等命令即可,无需追加额外参数。
方案3:临时写入开发环境配置文件(不推荐)
如果仅需要临时执行一次迁移,可将连接串写入 appsettings.Development.json 文件,需注意务必将该文件加入 .gitignore 避免敏感配置提交到代码仓库。
内容的提问来源于stack exchange,提问作者TommiAL
相关产品推荐
相关产品推荐

