ASP.NET MVC Identity自定义表名出现Multiplicity is not valid错误如何解决
问题成因
你对IdentityUserRole和IdentityUserLogin的主键配置违反了ASP.NET Identity的内置关系约束:
- 原生
IdentityUserRole作为用户和角色多对多关系的中间表,主键是UserId+RoleId的联合主键,你仅配置HasKey(x => x.RoleId)相当于将角色ID设为唯一主键,直接导致一个角色只能关联一个用户,和内置的多对多重数规则冲突,触发了你看到的报错。 - 同理原生
IdentityUserLogin的主键是LoginProvider+ProviderKey+UserId的联合主键,你仅配置HasKey(x => x.UserId)会导致一个用户只能绑定一条登录凭证,后续使用第三方登录等功能时也会触发同类错误。
另外你同时配置IdentityUser和ApplicationUser映射到同一张Web_Users表属于冗余配置,ApplicationUser本身继承自IdentityUser,不需要重复配置父类的映射规则,IdentityRole配置末尾多余的分号属于可忽略的语法小问题。
修复方案
将OnModelCreating方法替换为以下代码即可:
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<ApplicationUser>().ToTable("Web_Users").HasKey(x => x.Id); // 配置用户角色中间表联合主键 modelBuilder.Entity<IdentityUserRole>().ToTable("Web_UserRoles").HasKey(x => new { x.UserId, x.RoleId }); // 配置用户登录凭证表联合主键 modelBuilder.Entity<IdentityUserLogin>().ToTable("Web_UserLogins").HasKey(x => new { x.LoginProvider, x.ProviderKey, x.UserId }); modelBuilder.Entity<IdentityUserClaim>().ToTable("Web_UserClaims").HasKey(x => x.Id); modelBuilder.Entity<IdentityRole>().ToTable("Web_Roles").HasKey(x => x.Id); }
如果你的现有业务数据库中Web_UserRoles、Web_UserLogins的主键结构和Identity内置规则不一致,需要先调整表结构对齐,或者自定义IdentityUserRole、IdentityUserLogin的实现类适配现有表结构。
内容的提问来源于stack exchange,提问作者Lord Yggdrasill
相关产品推荐
相关产品推荐

