如何解决dotnet ef强制要求connectionString存放在appsettings.Development.json的问题
问题原因
dotnet ef 工具本地执行时默认使用Development环境加载配置,出现找不到基础appsettings.json中连接字符串的问题,一般是以下几个原因导致的:
- 配置加载逻辑错误:项目中重写的配置构建逻辑未优先加载基础
appsettings.json,或是环境特有的配置文件加载时optional参数设为了false,缺少对应配置项就直接报错 appsettings.json文件属性配置错误:文件的「复制到输出目录」属性设为了「不复制」,ef工具运行时无法读取到该文件- 执行命令的工作目录错误:在解决方案根目录而非项目根目录执行ef命令,工具找不到项目下的
appsettings.json文件 - 自定义DbContext设计时工厂逻辑错误:自行实现的
IDesignTimeDbContextFactory<T>中只加载了环境特有的配置文件,未加载基础配置文件
可行解决方案
你可以根据自己的实际情况选择以下任意一种方案,无需在appsettings.Development.json中重复存放连接字符串:
- 修正配置加载逻辑
默认WebApplication.CreateBuilder已经内置了正确的配置加载顺序:先加载必选的基础appsettings.json,再加载可选的环境对应配置文件,缺失的配置会自动 fallback 到基础配置中。如果你自定义了配置构建逻辑,需要补充基础配置的加载逻辑;如果你自定义了DbContext设计时工厂,示例参考如下:
public class AppIdentityDbContextFactory : IDesignTimeDbContextFactory<AppIdentityDbContext> { public AppIdentityDbContext CreateDbContext(string[] args) { var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) // 必须优先加载基础配置 .AddJsonFile("appsettings.json", optional: false) // 环境配置设为可选,不存在就自动用基础配置 .AddJsonFile("appsettings.Development.json", optional: true) .Build(); var optionsBuilder = new DbContextOptionsBuilder<AppIdentityDbContext>(); optionsBuilder.UseSqlServer(config.GetConnectionString("Identity")); return new AppIdentityDbContext(optionsBuilder.Options); } }
- 修正文件属性
右键appsettings.json文件 -> 选择「属性」,将「复制到输出目录」修改为「如果较新则复制」即可。 - 执行命令时指定项目路径
如果习惯在解决方案根目录执行命令,补充--project参数指定项目路径:dotnet ef database update --Context AppIdentityDbContext --project ./src/你的项目名称 - 执行命令时直接传入连接字符串
不需要修改任何项目配置,执行命令时通过--connection参数直接指定连接字符串:dotnet ef database update --Context AppIdentityDbContext --connection "Server=你的数据库地址;Database=你的库名;Trusted_Connection=True;TrustServerCertificate=True;" - 本地配置环境变量
在本地系统环境变量中新增名为ConnectionStrings__Identity的变量,值为你的连接字符串,ef工具会优先读取环境变量的配置,无需修改项目文件。
内容的提问来源于stack exchange,提问作者DiPix
相关产品推荐
相关产品推荐

