.NET Core开发环境运行API错误连接生产数据库如何解决
问题根因
- 配置加载逻辑仅硬编码引入了
appsettings.Development.json,未根据当前运行环境动态加载对应环境的配置文件 - DbContext的
OnConfiguring方法中存在硬编码的连接字符串,优先级高于配置文件加载的连接串 - 未正确将配置中的连接字符串注入到DbContext的配置逻辑中
解决方案
步骤1:修复配置文件加载逻辑
修改Startup.cs中的配置构建代码,根据当前运行的环境变量动态加载对应环境的appsettings文件,不要硬编码绑定Development版本:
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) // 动态获取当前环境名加载对应配置文件 .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build();
注:将appsettings.json的optional参数改为false,避免核心配置文件丢失时程序静默启动引发异常
步骤2:将配置的连接串注入到DbContext
在Startup.cs的ConfigureServices方法中添加DbContext注册逻辑,直接从配置中读取连接串传入:
services.AddDbContext<替换为你的DbContext类名>(options => options.UseSqlServer(Configuration.GetConnectionString("Db")) );
步骤3:清理DbContext的硬编码逻辑
修改DbContext的OnConfiguring方法,移除硬编码的连接串,仅保留兜底逻辑适配无依赖注入的场景(比如本地执行EF迁移):
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { IConfiguration config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json") .Build(); optionsBuilder.UseSqlServer(config.GetConnectionString("Db")); } }
验证效果
- 启动
API (dev)配置项时,ASPNETCORE_ENVIRONMENT为Development,会自动读取appsettings.Development.json中的测试库连接串 - 启动
API (prod)配置项时,ASPNETCORE_ENVIRONMENT为Production,会读取appsettings.json中的生产库连接串
内容的提问来源于stack exchange,提问作者J. Petersen
相关产品推荐
相关产品推荐

