You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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命令。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:15:02