ASP.NET Core迁移Identity表到User自定义Schema时部分表异常如何解决
问题根因
你遇到的问题本质是Identity实体的泛型主键参数不匹配,加上base.OnModelCreating的执行顺序导致配置覆盖,具体如下:
- 默认
IdentityDbContext如果没有指定完整泛型参数,会默认注册主键类型为string的所有Identity实体,而你手动配置的IdentityRoleClaim<int>、IdentityUserClaim<int>是主键为int的另一套实体,和实际运行时用到的实体不是同一个,因此对应的Schema配置不生效。 - 你之前的迁移文件中出现
CreateTable生成新的Claim表的逻辑,就是因为EF Core把你配置的int主键Claim实体识别为了新实体,而原有默认string主键的Claim表还在默认Schema中,没有被修改。 base.OnModelCreating位置不同现象相反的原因:- 放在开头时,默认注册的
string主键实体先生效,你后续配置的非Claim实体(泛型和默认匹配)会覆盖默认配置,而Claim实体你配置的是int版本和默认不匹配,因此不生效 - 放在末尾时,你先写的配置会被base方法里的默认配置覆盖,只有你配置的
int版本Claim实体和默认不冲突,因此只有这俩配置生效
- 放在开头时,默认注册的
解决方案
步骤1:修正DbContext的继承泛型参数
按照你实际的主键类型(此处你用的是int),指定IdentityDbContext的完整泛型参数,示例如下:
public class ApplicationDbContext : IdentityDbContext< ApplicationUser, // 你的自定义用户类 IdentityRole<int>, // 角色类,主键为int int, // 全局主键类型 IdentityUserClaim<int>, // 用户Claim类,主键为int IdentityUserRole<int>, // 用户角色关联类,主键为int IdentityUserLogin<int>, // 用户登录类,主键为int IdentityRoleClaim<int>, // 角色Claim类,主键为int IdentityUserToken<int>> // 用户Token类,主键为int > { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } // 其余DbContext逻辑 }
步骤2:统一OnModelCreating配置
保持base.OnModelCreating在方法开头,所有手动配置的实体泛型参数和上面继承时指定的保持一致:
protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.Entity<IdentityRole<int>>().ToTable("AspNetRoles", schema: "User"); builder.Entity<IdentityRoleClaim<int>>().ToTable("AspNetRoleClaims", schema: "User"); builder.Entity<ApplicationUser>().ToTable("AspNetUsers", schema: "User"); builder.Entity<IdentityUserClaim<int>>().ToTable("AspNetUserClaims", schema: "User"); builder.Entity<IdentityUserLogin<int>>().ToTable("AspNetUserLogins", schema: "User"); builder.Entity<IdentityUserRole<int>>().ToTable("AspNetUserRoles", schema: "User"); builder.Entity<IdentityUserToken<int>>().ToTable("AspNetUserTokens", schema: "User"); }
步骤3:重新生成迁移
删除之前生成的错误迁移文件,重新执行迁移命令生成新的迁移,此时生成的迁移会对所有Identity表执行RenameTable修改Schema,不会出现多余的CreateTable逻辑,更新数据库后所有表都会迁移到UserSchema下。
内容的提问来源于stack exchange,提问作者AhmadYazdany18
相关产品推荐
相关产品推荐

