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

ASP.NET Core MVC报错AspNetUserLogin需定义主键求助

问题根因

报错的核心来源是两个错误操作:一是违背ASP.NET Core Identity的默认表结构约定手动改表结构,二是使用Scaffold-DbContext反向生成模型时破坏了Identity内置的实体映射配置。

关键认知纠正
  • Identity默认生成的AspNetUserLogins表不需要单独的Id主键列,其原生设计是用LoginProvider + ProviderKey组成复合主键,你手动添加Id列并将其设为主键的操作,完全不符合Identity的内置映射规则,会直接导致身份验证逻辑、数据库迁移双双报错。
  • 启用Identity的项目不适合直接全库执行Scaffold-DbContext:反向工程工具不会自动识别Identity的实体映射规则,只会按普通表生成实体和配置,会直接覆盖、冲突Identity自带的主键、关联关系配置,这是主键缺失报错的根源。
  • 之前移除属性get/set访问器的方案不对症,问题本质是实体主键配置错误,和属性访问器无关。
分步修复方案
  • 第一步:清理错误修改
    • 删掉你手动给AspNetUserLogins添加Id列的自定义迁移代码,将迁移文件恢复到Identity初始生成的默认状态,不要手动修改任何Identity内置表的默认建表逻辑。
    • 删除所有Scaffold-DbContext生成的AspNet*开头的Identity相关实体类,不要自行维护这些内置表的实体定义。
  • 第二步:修正DbContext配置
    • 确保你的项目数据库上下文继承自泛型IdentityDbContext<TUser>,其中TUser是你项目中使用的用户类(如果没自定义用户类就直接继承IdentityDbContext),不要使用普通的DbContext基类。
    • 两个自定义关联用户的模型,直接添加外键字段和导航属性即可,示例:
      public class CustomBusinessModel
      {
          public int Id { get; set; }
          // 关联AspNetUsers表的外键
          public string CreatorId { get; set; }
          // 用户导航属性
          public IdentityUser Creator { get; set; }
          // 其余业务字段
      }
      
    • 在上下文的OnModelCreating方法中,必须先调用base.OnModelCreating(builder)加载Identity内置配置,只追加自定义业务模型的关联配置,不要重复配置任何Identity内置表的规则,示例:
      protected override void OnModelCreating(ModelBuilder builder)
      {
          // 必须先调用基类方法加载Identity默认配置
          base.OnModelCreating(builder);
          
          // 仅配置自己的业务模型关联,不要碰AspNet开头的内置表
          builder.Entity<CustomBusinessModel>()
              .HasOne(m => m.Creator)
              .WithMany()
              .HasForeignKey(m => m.CreatorId)
              .OnDelete(DeleteBehavior.Cascade);
      }
      
  • 第三步:生成干净迁移并更新数据库
    • 开发环境下最稳妥的方式是删除本地旧数据库、删除项目中所有之前生成的错误迁移文件;如果不能删库,就手动删除数据库中__EFMigrationsHistory表中对应错误迁移的记录,同时删掉你手动给AspNetUserLogins加的Id列,恢复表的原始结构。
    • 重新执行迁移命令生成干净的初始化迁移:
      Add-Migration InitialIdentityAndBusiness
      Update-Database
      
  • 后续避坑
    • 只要项目用了Identity,执行Scaffold-DbContext时必须加-Tables参数,只指定你自己的业务表生成模型,绝对不要把Identity内置表包含在反向生成范围内。
    • 没有全量自定义Identity主键配置的前提下,不要手动修改任何Identity默认表的主键结构,否则必然出现映射不匹配问题。

校验标准:正确生成的迁移中,AspNetUserLogins表的主键是LoginProvider和ProviderKey组成的复合主键,不存在多余的Id列,此时登录操作、数据库更新都不会再报主键缺失错误。

内容的提问来源于stack exchange,提问作者dokichan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:54:32