EF Core控制台应用数据库连接触发ArgumentNullException异常
问题原因
执行add-migration时抛出ArgumentNullException提示连接字符串为空,本质是EF Core设计时工具创建MyDbContext实例时,ConfigurationManager.AppSettings["DbConnectionString"]读取结果为null,具体触发逻辑:
- EF Core迁移命令属于设计时操作,运行在独立的执行上下文,默认不会自动加载项目中的
app.config配置,调用无参构造创建DbContext时,自然读不到配置节点里的连接字符串 - 控制台项目如果未安装配置读取相关的NuGet包,或是
app.config未设置为复制到输出目录,就算是程序正常运行时也可能出现读值为空的问题
修复步骤
1 补全基础依赖和配置属性
- 先通过NuGet给项目安装必需的依赖包:
Microsoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.DesignSystem.Configuration.ConfigurationManager(控制台项目读取app.config的appSettings节点必须安装此包,缺失时ConfigurationManager无法正常读取配置内容)
- 右键项目中的
app.config文件打开属性面板,将「复制到输出目录」选项设置为如果较新则复制,保证编译后配置文件会生成到程序运行目录。
2 添加设计时DbContext工厂
这是解决EF Core迁移时读不到配置最稳妥的方案,实现IDesignTimeDbContextFactory接口专门给迁移等设计时场景提供DbContext实例,完全不影响程序运行时的原有逻辑。
在项目中新增如下类:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using System.Configuration; public class MyDbContextFactory : IDesignTimeDbContextFactory<MyDbContext> { public MyDbContext CreateDbContext(string[] args) { var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>(); var connStr = ConfigurationManager.AppSettings["DbConnectionString"]; optionsBuilder.UseSqlServer(connStr); return new MyDbContext(optionsBuilder.Options); } }
添加完成后再执行add-migration命令,工具会优先通过这个工厂类创建DbContext,不会再触发无参构造中读不到配置的问题。
其他优化建议
你当前代码中public virtual DbSet<MyUsers> MyUser{ get; set; }的属性名是单数形式,和实体类型MyUsers不匹配,建议修改为MyUsers,避免后续出现表名映射错误。
内容的提问来源于stack exchange,提问作者MJ X
相关产品推荐
相关产品推荐

