EF Core 连接字符串应存于 appsettings.json 并通过 IConfiguration 注入读取,开发用 User Secrets、生产用环境变量,禁止硬编码或写死在 DbContext 中。

EF Core 的连接字符串不该硬编码,也不该放在 DbContext 类里写死。最安全、最灵活的做法是:统一存进 appsettings.json,再通过 IConfiguration 注入读取,配合环境隔离和敏感信息保护机制。
连接字符串标准存放位置:appsettings.json
这是 ASP.NET Core 官方推荐方式,支持多环境切换(Development/Production),也便于 CI/CD 管理。
- 在 appsettings.json 中添加 ConnectionStrings 节点:
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=MyAppDb;User Id=sa;Password=StrongPass123!;"
}
}
- 生产环境应使用 appsettings.Production.json 单独覆盖,避免本地密码泄露到代码库
- 开发时可用 dotnet user-secrets 替代 appsettings.json 存储密码,命令示例:
dotnet user-secrets set "ConnectionStrings:DefaultConnection" "Server=localhost;Database=MyAppDb;User Id=sa;Password=DevOnly123!;"
注册 DbContext 时正确读取连接字符串
在 Program.cs(.NET 6+)中用 Configuration.GetConnectionString() 获取,不要拼接或写死:
- ✅ 正确写法(依赖注入 + 配置中心):
var builder = WebApplication.CreateBuilder(args); builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")))
- ❌ 错误写法(硬编码、易出错、不安全):
options.UseSqlServer("Server=localhost;Database=MyAppDb;User Id=sa;Password=123456;") // 密码明文暴露
- 若用 MySQL/PostgreSQL,替换 UseSqlServer 为 UseMySql / UseNpgsql,并确保 NuGet 包已安装
敏感信息必须脱敏处理
数据库密码、账号等属于高危凭据,不能出现在源码、Git 历史或日志中。
- 开发阶段优先用 User Secrets(仅限本机),它自动忽略 Git,且被 AddDbContext 自动识别
- 生产部署时,改用 环境变量,例如 Linux 下启动前执行:
export ConnectionStrings__DefaultConnection="Server=prod-sql;Database=MyApp;User Id=appuser;Password=$DB_PASS;"
- ASP.NET Core 配置系统会自动将双下划线 __ 映射为层级(即 ConnectionStrings:DefaultConnection)
- 避免在 OnConfiguring 方法里手动 new SqlConnectionStringBuilder 或拼接字符串——这绕过配置系统,失去环境适配能力
多层架构中的特别注意点
如果项目分 UI 层、Domain 层、Infrastructure 层,DbContext 和连接字符串配置逻辑应只出现在 UI 层(如 Web API 项目),因为:
- 设计时迁移(dotnet ef migrations)需要运行时能访问 IConfiguration,否则会报 “无法解析 IWebHostEnvironment” 或连接字符串为空
- 领域层不应引用 Microsoft.Extensions.Configuration,否则破坏分层原则
- 若需在非 Web 项目(如 Console Host)中做迁移,需手动构建 Host 并加载配置,参考官方 IDesignTimeDbContextFactory 实现
基本上就这些。核心就一条:连接字符串是配置项,不是代码逻辑——交给配置系统管,别自己造轮子。










