You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:42:01