EF Core 2使用UseSqlServer时数据库未创建,迁移报错连接字符串为空
解决EF Core Add-Migration连接字符串为Null及数据库不自动创建问题
核心问题定位
你碰到的这个问题其实很典型——EF Core的设计时工具(比如Add-Migration)会优先使用DesignTimeDbContextFactory来创建DbContext实例,而不是Startup里的配置逻辑。从报错信息看,你的SmartMiner.API.DesignTimeDbContextFactory.CreateDbContext方法第19行的连接字符串是null,说明这个工厂类里没有正确读取到appsettings.json里的配置,而Startup里的逻辑是正常的,所以运行时调试能拿到正确值,但迁移命令不行。
步骤1:修复DesignTimeDbContextFactory的配置读取
默认情况下,设计时工厂不会自动加载appsettings.json,你需要手动构建配置对象。修改你的DesignTimeDbContextFactory类,让它正确读取配置文件:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; using System.IO; namespace SmartMiner.API { public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<ApplicationContext> { public ApplicationContext CreateDbContext(string[] args) { // 构建配置,加载appsettings.json及环境特定配置文件 IConfigurationRoot configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true) .Build(); // 获取你需要的连接字符串 string connectionString = configuration.GetConnectionString("DebugContext"); var optionsBuilder = new DbContextOptionsBuilder<ApplicationContext>(); optionsBuilder.UseSqlServer(connectionString); return new ApplicationContext(optionsBuilder.Options); } } }
修改完成后,再运行Add-Migration InitialCreate就能正确读取连接字符串,生成迁移文件了。
步骤2:解决数据库不自动创建的问题
EF Core和.NET Framework时代的EF行为不同,默认不会自动创建数据库或应用迁移,你需要显式触发这个操作。在.NET Core 2.x的Startup.cs的Configure方法中,注入DbContext并执行迁移或创建逻辑:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ApplicationContext context) { // ... 其他中间件配置代码 // 推荐:应用所有未执行的迁移(会保留迁移历史,方便后续版本更新) context.Database.Migrate(); // 可选:仅创建数据库和表结构(不处理迁移,适合快速原型开发) // context.Database.EnsureCreated(); }
额外排查点
- 确认appsettings.json的复制到输出目录属性设置为「始终复制」:右键文件→属性→复制到输出目录,选择该选项,避免部署时配置文件未被复制到输出文件夹。
- 检查环境变量是否覆盖配置:有时候开发环境的环境变量(比如项目启动配置或系统环境变量)会覆盖appsettings.json里的连接字符串,可以在调试时输出
configuration.GetConnectionString("DebugContext")确认最终取值。
完成以上操作后,运行Update-Database就能创建数据库,项目启动时也会自动应用迁移(如果使用了Migrate()方法)。
内容的提问来源于stack exchange,提问作者Mark Hollas




