EF Core执行Add-Migration时报connectionString为空异常,求解决方案
解决Add-Migration时connectionString为null的ArgumentNullException问题
问题根源
当你执行PM> Add-Migration Initial时,EF Core的设计时工具会调用DbContext的无参构造函数,但你的无参构造函数并没有初始化connectionString字段,导致OnConfiguring方法里调用UseSqlServer(connectionString)时传入了null,触发了ArgumentNullException。
看你的代码:
public EFarmerDbModel() : base() { OnCreated(); }
这个构造函数完全没给connectionString赋值,而OnConfiguring里直接使用了这个未初始化的字段,自然会报错。另外,你在OnConfiguring里重复调用了UseSqlServer,这也是不必要的,会覆盖之前的配置逻辑。
解决方案
我们需要确保设计时工具能获取到有效的连接字符串,这里提供两种实用的修复方式:
方式1:通过配置文件加载连接字符串(推荐用于生产/正式项目)
如果你的类库项目有appsettings.json配置文件,可直接在OnConfiguring中读取配置:
- 先确保
appsettings.json的属性设置为复制到输出目录(选择「始终复制」或「如果较新则复制」) - 修改
OnConfiguring方法:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // 避免重复配置EF上下文 if (!optionsBuilder.IsConfigured) { // 加载类库目录下的配置文件 var configBuilder = new ConfigurationBuilder() .SetBasePath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); var connectionString = configBuilder.GetConnectionString("EFarmerDbConnection"); // 合并LazyLoading和SQL Server配置,指定迁移程序集 optionsBuilder.UseLazyLoadingProxies() .UseSqlServer(connectionString, x => x.MigrationsAssembly("EFarmerPkModelLibrary.Migrations")); } CustomizeConfiguration(ref optionsBuilder); base.OnConfiguring(optionsBuilder); }
- 在
appsettings.json中添加连接字符串:
{ "ConnectionStrings": { "EFarmerDbConnection": "你的SQL Server完整连接字符串" } }
方式2:在无参构造函数中直接初始化connectionString(仅适合测试场景)
如果只是临时测试,不想配置文件,可以直接在无参构造函数里硬编码连接字符串:
public EFarmerDbModel() : base() { // 直接赋值连接字符串 connectionString = "Server=你的服务器名;Database=EFarmerDb;Trusted_Connection=True;TrustServerCertificate=True;"; OnCreated(); }
⚠️ 注意:硬编码连接字符串会暴露敏感信息,不建议用于生产环境。
验证修复
修改完成后,重新执行迁移命令:
PM> Add-Migration Initial
现在应该能正常生成初始迁移文件了。
内容的提问来源于stack exchange,提问作者Umair Tahir
相关产品推荐
相关产品推荐

