Entity Framework Core从appsettings.json读取连接字符串报错求助
解决连接字符串找不到及脚手架代码覆盖问题
一、修复运行时连接字符串未找到异常
1. 依赖注入方式配置上下文(推荐)
在Program.cs中直接通过依赖注入注册DbContext,从配置中读取连接字符串,这样可以跳过上下文的OnConfiguring方法,避免配置冲突:
builder.Services.AddDbContext<YourDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
后续通过构造函数注入获取上下文实例时,DI会自动应用该配置,无需依赖OnConfiguring中的代码。
2. 直接实例化上下文时的配置方案
如果必须直接new上下文实例,需要让上下文能访问到配置系统。修改上下文类,添加带IConfiguration的构造函数,并在OnConfiguring中增加判断逻辑:
public partial class YourDbContext : DbContext { private readonly IConfiguration _configuration; // 保留脚手架生成的无参构造函数(供脚手架工具使用) public YourDbContext() { } // 添加自定义构造函数,注入配置 public YourDbContext(IConfiguration configuration) { _configuration = configuration; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 仅当未通过DI配置时,才读取配置文件 if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlServer(_configuration.GetConnectionString("DefaultConnection")); } } // 脚手架生成的DbSet及实体映射代码... }
二、避免脚手架覆盖配置代码
1. 使用部分类分离配置逻辑
将配置相关代码放到单独的部分类文件中,脚手架只会修改它生成的主上下文文件,不会影响自定义配置:
- 保留脚手架生成的
YourDbContext.cs文件(不要修改其中的OnConfiguring,允许脚手架覆盖) - 新建
YourDbContext.Config.cs文件,写入自定义配置逻辑:
public partial class YourDbContext : DbContext { private readonly IConfiguration _configuration; public YourDbContext(IConfiguration configuration) { _configuration = configuration; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlServer(_configuration.GetConnectionString("DefaultConnection")); } } }
2. 脚手架命令添加参数禁用自动生成OnConfiguring
执行脚手架时,添加--no-onconfiguring参数,让工具不生成OnConfiguring方法:
Scaffold-DbContext Name=ConnectionStrings:DefaultConnection Microsoft.EntityFrameworkCore.SqlServer -force --no-onconfiguring
这样生成的上下文类仅包含实体和DbSet定义,完全依赖你自己的DI配置或部分类逻辑。
三、配置加载完整性检查
确保Program.cs中加载了环境特定的配置文件,实现不同构建配置使用不同连接字符串:
builder.Configuration .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", optional: true, reloadOnChange: true);
比如开发环境会自动加载appsettings.Development.json,可在其中单独配置开发环境的连接字符串。
常见排查点
- 确认
appsettings.json的复制到输出目录属性设置为「始终复制」或「如果较新则复制」,避免运行时找不到配置文件 - 检查连接字符串名称大小写是否完全匹配(配置系统对键名大小写敏感)
- 验证输出目录中是否存在对应的配置文件
内容的提问来源于stack exchange,提问作者Danilo Namitala
相关产品推荐
相关产品推荐

