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默认表的主键结构,否则必然出现映射不匹配问题。
- 只要项目用了Identity,执行
校验标准:正确生成的迁移中,
AspNetUserLogins表的主键是LoginProvider和ProviderKey组成的复合主键,不存在多余的Id列,此时登录操作、数据库更新都不会再报主键缺失错误。
内容的提问来源于stack exchange,提问作者dokichan
相关产品推荐
相关产品推荐

