.NET Core 7中如何在Program.cs读取对应环境的数据库连接字符串?
ASP.NET Core 7 读取环境配置并传递连接字符串给EF Core 7
问题分析
在ASP.NET Core 7的精简Program.cs模式下,默认配置系统会自动根据当前运行环境加载对应配置文件(比如开发环境加载appsettings.Development.json),但你的代码存在两个关键问题:
appsettings.Development.json结构错误:ConnectionStrings被嵌套在Logging节点下,导致配置系统无法正确读取- 误解环境读取时机:在
builder.Build()之前,就可以通过builder.Environment访问当前环境,无需等到创建app实例之后
第一步:修正配置文件结构
将appsettings.Development.json中的ConnectionStrings节点移到根层级,和主配置文件保持一致:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "ConnectionStrings": { "Database": "你的开发环境数据库连接字符串" } }
第二步:正确注入DbContext并读取连接字符串
ASP.NET Core的配置系统会自动合并主配置文件和对应环境的配置文件(环境配置会覆盖主配置的同名节点),无需手动判断环境,直接使用builder.Configuration.GetConnectionString("Database")即可自动获取当前环境的连接字符串。
如果需要针对不同环境做特殊配置(比如开发环境用SQLite,生产环境用SQL Server),可以在注入DbContext时通过builder.Environment判断:
修正后的Program.cs代码:
var builder = WebApplication.CreateBuilder(args); // 注册服务 builder.Services.AddScoped<INavigationHelper, NavigationHelper>(); builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd")); builder.Services.AddAuthorization(options => { options.FallbackPolicy = options.DefaultPolicy; }); builder.Services.AddControllersWithViews(options => { var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build(); options.Filters.Add(new AuthorizeFilter(policy)); }); builder.Services.AddRazorPages().AddMicrosoftIdentityUI(); // 注入DbContext,自动读取对应环境的连接字符串 builder.Services.AddDbContext<SiteDbContext>(options => { // 自动获取合并后的连接字符串 var connectionString = builder.Configuration.GetConnectionString("Database"); // 可选:根据环境做特殊配置 if (builder.Environment.IsDevelopment()) { options.UseSqlServer(connectionString); } else { // 生产环境的配置逻辑 options.UseSqlServer(connectionString); } }); var app = builder.Build(); if (!app.Environment.IsDevelopment()) { app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.MapRazorPages(); app.MapControllers(); app.Run();
关键说明
- 配置合并逻辑:主
appsettings.json的配置会被appsettings.{Environment}.json中的同名节点覆盖,只需在环境配置文件中定义需要覆盖的配置项(比如开发环境的数据库连接字符串) - 环境访问时机:
builder.Environment在WebApplication.CreateBuilder(args)之后就可直接访问,无需等到app实例创建完成,这是ASP.NET Core 7精简模式的原生支持,无需恢复Startup.cs
内容的提问来源于stack exchange,提问作者Matthew Verstraete
相关产品推荐
相关产品推荐

