如何让EF Core 6不再读取appsettings.json,使用指定连接字符串?
问题解决:EF Core 误读 AppInsights 连接字符串的处理
问题原因
你的代码已明确通过 UseSqlServer(DatabaseConnectionString) 指定连接字符串,但仍出现读取 AppInsights 下 ConnectionString 的情况,大概率是以下原因之一:
- DbContext 的
OnConfiguring方法中重新调用了UseSqlServer且未指定连接字符串(EF Core 会自动尝试从配置中查找匹配项); - 获取
ihcSqlDatabaseConnectionString时出错(如配置键名错误、值为空),导致UseSqlServer自动 fallback 读取配置; AddServices()方法内部存在重复配置ProxyServiceDbContext的逻辑,覆盖了你后续指定的连接字符串。
解决方案
1. 检查并修正 DbContext 的 OnConfiguring 方法
打开 ProxyServiceDbContext 类,查看是否存在类似错误代码:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 错误示例:未指定连接字符串,EF Core 会自动查找配置中的 ConnectionString optionsBuilder.UseSqlServer(); // 或错误读取了 AppInsights 的连接字符串 optionsBuilder.UseSqlServer(_configuration["AppInsights:ConnectionString"]); }
修正方式:
- 若不需要在
OnConfiguring中配置,直接删除该方法; - 若必须保留,仅在未配置时处理,并使用明确的连接字符串:
public class ProxyServiceDbContext : DbContext { private readonly string _connectionString; // 通过构造函数注入连接字符串(推荐方式) public ProxyServiceDbContext(DbContextOptions<ProxyServiceDbContext> options, string connectionString) : base(options) { _connectionString = connectionString; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { // 使用注入的连接字符串,而非自动读取配置 optionsBuilder.UseSqlServer(_connectionString); } } }
2. 验证指定的连接字符串有效性
在代码中添加调试输出,确认 DatabaseConnectionString 的值正确:
string DatabaseConnectionString = string.Concat(ihcSqlDatabaseConnectionString, ";persist security info = True;MultipleActiveResultSets=True;App=EntityFramework;"); // 添加调试输出 Console.WriteLine($"当前使用的数据库连接字符串:{DatabaseConnectionString}");
如果输出为空或格式错误,检查 Settings:IhcSqlDatabaseConnectionString 在 appsettings.json 中的配置是否正确。
3. 排查 AddServices() 方法的重复配置
检查 AddServices() 内部是否调用了 AddDbContext<ProxyServiceDbContext>,如果存在,将你的 AddDbContext 调用放在 AddServices() 之后,或移除 AddServices() 中的重复配置,确保最终生效的是你指定的连接字符串。
4. 确认配置加载逻辑正确
添加调试输出验证配置加载结果,确保没有读取错误的配置项:
_config = configurationFile.Build(); // 输出 Settings 下的连接字符串 Console.WriteLine($"读取到的初始连接字符串:{_config.GetSection("Settings")["IhcSqlDatabaseConnectionString"]}");
内容的提问来源于stack exchange,提问作者Arun Prakash Nagendran
相关产品推荐
相关产品推荐

