Visual Studio包管理器中如何修改Update-Database的目标更新数据库
你定位到的secrets.json覆盖连接字符串的问题是正确的,本质是ASP.NET Core默认的配置加载优先级导致的,本地开发环境下机密管理器(secrets.json)的配置优先级高于appsettings.json。
配置优先级规则
ASP.NET Core默认按以下顺序加载配置,后加载的配置会覆盖之前的同名配置:
- appsettings.json
- appsettings.{环境名}.json
- 机密管理器(secrets.json,仅Development环境生效)
- 系统环境变量
- 命令行参数
你执行Update-Database时默认使用Development环境,所以secrets.json里的连接字符串配置会覆盖你在appsettings.json中修改的配置,导致始终连接测试库。
可用解决方案
方法1:修改secrets.json配置
右键Visual Studio中的项目,选择「管理用户机密」打开secrets.json文件,修改其中ConnectionStrings:MapItGODBConnection对应的值为正式库连接字符串,保存后重新执行Update-Database即可。
方法2:执行命令时直接指定连接字符串
无需修改任何配置文件,直接在包管理器控制台执行带参数的迁移命令,直接指定正式库连接信息:
Update-Database -Connection "你的正式数据库完整连接字符串" -ConnectionProviderName "Microsoft.EntityFrameworkCore.SqlServer"
该方案适合临时迁移正式库的场景,不会影响本地开发环境的现有配置。
方法3:临时切换命令执行环境为Production
在包管理器控制台先设置临时环境变量,再执行迁移命令,此时不会加载Development环境的secrets.json配置,直接读取appsettings.json的配置:
# 先设置环境为Production $env:ASPNETCORE_ENVIRONMENT = "Production" # 再执行迁移命令 Update-Database
补充说明
你不需要重写DbContext的OnConfiguring方法,现有配置逻辑没有问题。正式环境部署到Azure时,建议使用Azure应用服务的「配置」功能存储连接字符串,既可以避免敏感信息泄露,也可以灵活切换配置无需修改代码。
内容的提问来源于stack exchange,提问作者Gregory Hill

