.NET Core 2.0 EF Core迁移报错:Value cannot be null. Parameter name: key
解决EF Core 2.0.1执行
Add-Migration时的ArgumentNullException(Parameter name: key) 这个错误我之前帮人排查过好几次,本质是EF Core在初始化上下文、准备迁移的时候,找不到某个实体的有效主键配置,导致内部校验失败抛出异常。下面是几个最常见的原因和对应的解决办法:
1. 实体类未正确配置主键
EF Core默认会自动识别命名为Id或者[实体名]Id的属性作为主键,但如果你的实体没有符合这个命名规则,也没手动指定主键,EF就无法找到有效的主键,进而触发这个错误。
- 反例:比如你有一个
Order实体,既没有int Id { get; set; },也没有int OrderId { get; set; },也没加[Key]特性标注主键。 - 解决办法:
- 方法一:用数据注解给主键属性加上
[Key]特性:public class Order { [Key] public int OrderNumber { get; set; } // 其他属性... } - 方法二:在DbContext的
OnModelCreating方法里用Fluent API指定主键:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Order>().HasKey(o => o.OrderNumber); // 其他配置... }
- 方法一:用数据注解给主键属性加上
2. 主键属性被设置为可空类型
EF Core要求主键属性不能为null(除非是数据库生成的特殊类型,比如Guid,但也要正确配置),如果你把主键设成了可空值类型(比如int?),EF无法识别这是一个有效的主键,就会报错。
- 反例:
public class User { public int? UserId { get; set; } // 错误:主键不能为可空 // 其他属性... } - 解决办法:把主键改成非可空类型,比如
public int UserId { get; set; };如果确实需要用可空类型作为主键(比如数据库允许的情况),要配合[DatabaseGenerated(DatabaseGeneratedOption.Identity)]或者Fluent API配置自动生成值。
3. 迁移程序集配置不匹配
你的错误信息里提到MigrationsAssembly=Project.Data,如果DbContext的迁移程序集配置和实际迁移所在的项目不一致,或者Package Manager控制台的默认项目选错了,也可能导致EF无法正确加载实体配置,引发主键相关错误。
- 解决办法:
- 检查Startup.cs中DbContext的配置,确保
MigrationsAssembly指定的程序集名称正确:services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly("Project.Data"))); - 在Package Manager控制台顶部的“默认项目”下拉框里,选择
Project.Data(也就是迁移所在的项目),再执行Add-Migration命令。
- 检查Startup.cs中DbContext的配置,确保
4. 实体配置存在错误的主键设置
如果在Fluent API中给实体配置了一个不存在的属性作为主键,或者重复配置了主键,也会导致EF找不到有效的Key。
- 反例:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 错误:NonExistentProperty不存在于User实体中 modelBuilder.Entity<User>().HasKey(u => u.NonExistentProperty); } - 解决办法:仔细检查
OnModelCreating里的所有实体配置,确保主键指向的是实体中存在的、非可空的属性,没有重复的主键配置。
调试小技巧
如果还是找不到问题,可以暂时简化你的ApplicationDbContext:只保留一个最简单的实体(比如带Id的Test实体),然后尝试执行Add-Migration。如果成功,再逐个添加其他实体,直到触发错误,这样就能快速定位到有问题的实体配置。
内容的提问来源于stack exchange,提问作者Sergiy Divnych
相关产品推荐
相关产品推荐

