EF Core迁移报错:ConnectionString属性未初始化问题求助
EF Core跨项目执行迁移时连接字符串未初始化问题
问题场景
- 解决方案包含多个项目,计划将迁移及数据库交互逻辑放在VSC.Repo项目(
DbContext所在项目),但连接字符串存储在VSC.API项目的appsettings.json中 - 在VSC.Repo项目中执行
dotnet ef database update命令时,始终报错:The ConnectionString property has not been initialized - 硬编码连接字符串可正常运行,但属于不良实践,不愿采用
相关代码
DataContext类(VSC.Repo项目)
public class DataContext : DbContext { private readonly string connectionString; public DataContext() { } public DataContext(DbContextOptions<DataContext> options, IConfiguration configuration) : base(options) { connectionString = configuration.GetSection("ConnectionStrings:DefaultConnection").Value; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(connectionString); } }
appsettings.json(VSC.API项目)
"ConnectionStrings": { "DefaultConnection": "server=localhost;database=vscDatabase;trusted_connection=true;TrustServerCertificate=True;" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*"
Program.cs(VSC.API项目)
WebApplicationBuilder? builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); builder.Services.AddDbContext<DataContext>(options => options.UseSqlServer(connectionString)); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); //builder.AddRepoConfigurations(); var app = builder.Build();
问题原因
- EF Core工具执行迁移时,默认会调用
DataContext的无参构造函数,此时connectionString字段未赋值,导致OnConfiguring方法无法初始化连接字符串 - 即使使用带依赖注入参数的构造函数,你额外读取
IConfiguration的逻辑也是多余的——DbContextOptions已经通过Program.cs的配置包含了连接字符串,但你在OnConfiguring中又用未初始化的connectionString覆盖了正确配置
解决方案
1. 修正DataContext类
移除多余的字段和无参构造函数,让EF Core完全依赖注入配置:
public class DataContext : DbContext { // 仅保留接收DbContextOptions的构造函数 public DataContext(DbContextOptions<DataContext> options) : base(options) { } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 可选:仅在未通过依赖注入配置时添加备用逻辑(比如本地测试) if (!optionsBuilder.IsConfigured) { // 这里可临时添加测试用连接字符串,但不建议硬编码 // optionsBuilder.UseSqlServer("test_connection_string"); } } }
2. 执行命令时指定启动项目
因为连接字符串在VSC.API项目中,执行EF Core命令时需指定该项目作为启动项目,同时指定DbContext所在的Repo项目:
# 在解决方案根目录执行迁移创建 dotnet ef migrations add InitialCreate --project VSC.Repo --startup-project VSC.API # 执行数据库更新 dotnet ef database update --project VSC.Repo --startup-project VSC.API
这样EF Core工具会自动读取VSC.API项目中的appsettings.json配置,正确初始化连接字符串。
可选(不推荐):为Repo项目添加配置文件
若不想每次命令都指定启动项目,可在VSC.Repo项目中添加appsettings.json并复制连接字符串,但会造成配置冗余,增加维护成本,不建议使用。
内容的提问来源于stack exchange,提问作者Miguel Ferreira
相关产品推荐
相关产品推荐

