EF Core CLI指定UAT配置执行database update仍更新DEV库问题求助
迁移命令运行流程
dotnet ef database update 命令的执行逻辑如下:
- 按你指定的
--configuration UAT配置,编译启动项目MyProject和迁移项目MyModel - 加载启动项目程序集,运行服务注册逻辑构建DI容器
- 从DI容器中获取
DBContext实例,读取其配置的数据库连接串 - 连接目标数据库,执行所有未应用的迁移脚本
问题根因
你遇到的配置不生效问题,90%以上的概率是自定义的UAT编译配置没有添加对应的UAT预编译符号:
预编译指令是编译时生效的,只有当前编译配置的属性中明确定义了对应的条件编译符号,#elseif UAT的分支才会被编译进最终的程序集。默认创建的解决方案只有Debug、Release两个内置配置,自行新增的UAT配置不会自动添加UAT编译符号,所以编译时永远会走默认的DEV分支,导致连接串始终是DEV的。
修复方案
方案1:补全UAT配置的预编译符号
- 右键
MyProject项目,选择「属性」->「生成」 - 顶部的配置下拉框选择
UAT - 在「条件编译符号」输入框中添加
UAT,多个符号之间用分号分隔 - 保存项目属性后,重新执行迁移命令即可
如果是纯命令行操作,可以在编译时手动指定编译符号:
dotnet build MyProject -c UAT -p:DefineConstants="UAT"
之后再执行迁移命令即可生效。
方案2(更推荐):改用运行时环境变量区分环境
预编译指令需要针对每个配置单独编译,灵活性很低,更推荐用ASP.NET Core内置的环境变量机制区分环境:
- 把Program.Main中的预编译逻辑替换为运行时读取环境变量:
Setting.Env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "DEV";
- 执行迁移命令前先指定环境变量:
- Windows系统:
set ASPNETCORE_ENVIRONMENT=UAT && dotnet-ef database update --project MyModel --startup-project MyProject --context DBContext --configuration UAT -v
- Linux/macOS系统:
ASPNETCORE_ENVIRONMENT=UAT dotnet-ef database update --project MyModel --startup-project MyProject --context DBContext --configuration UAT -v
额外排查点
如果上述操作后依然不生效,排查以下两点:
- 检查
DBContext类是否存在无参构造函数,里面有没有硬编码DEV连接串,EF工具会优先使用无参构造函数创建DBContext实例 - 检查迁移项目
MyModel中是否存在实现了IDesignTimeDbContextFactory<DBContext>的类,如果有要同步修改它的连接串读取逻辑
内容的提问来源于stack exchange,提问作者Scorpion
相关产品推荐
相关产品推荐

