.NET Core5 EF Context用ConfigurationManager读appsettings.json连接串为空问询
根因说明
System.Configuration.ConfigurationManager是 .NET Framework 时代的遗留配置组件,默认仅支持读取app.config/web.config格式的配置文件,完全不识别.NET Core/.NET 5的appsettings.json。你读到的Count = 1是系统machine.config中内置的默认连接串,和你编写的appsettings.json没有任何关联。- Startup中能正常读取是因为使用了.NET Core 全新的
IConfiguration配置体系,该体系原生支持json、环境变量、命令行等多源配置加载。
解决方案
要支持EF迁移、直接new MyContext等脱离ASP.NET管道的场景,手动加载appsettings.json即可,步骤如下:
- 安装必要NuGet包
Microsoft.Extensions.Configuration Microsoft.Extensions.Configuration.Json Microsoft.EntityFrameworkCore.Design
- 修改
MyContext.cs代码:
using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using System.IO; namespace My.Models { public partial class MyContext : DbContext { private static readonly IConfiguration _configuration; // 静态构造函数,首次访问MyContext时自动加载配置 static MyContext() { _configuration = new ConfigurationBuilder() // 配置文件根目录为当前程序运行目录 .SetBasePath(Directory.GetCurrentDirectory()) // 加载appsettings.json,可选追加环境专属配置文件 .AddJsonFile("appsettings.json") .AddJsonFile("appsettings.Development.json", optional: true) .Build(); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { string connStr = _configuration.GetConnectionString("MyContext"); optionsBuilder.UseNpgsql(connStr); } } } }
注意事项
- 右键选中项目中的
appsettings.json,在属性面板将「复制到输出目录」修改为「如果较新则复制」,否则运行时输出目录不存在该文件会读取失败。 - 若MyContext定义在类库项目中,执行EF迁移时需要指定启动项目为包含
appsettings.json的ASP.NET Core项目,或者将appsettings.json同步复制到类库项目并设置相同的复制属性。
内容的提问来源于stack exchange,提问作者Baller
相关产品推荐
相关产品推荐

