如何修改ASP.NET Core Identity中AspNetUsers的主键数据类型
自定义用户类,指定主键类型为int
默认的IdentityUser主键是Guid,我们需要继承泛型版本的IdentityUser<int>来定义自己的用户类:public class ApplicationUser : IdentityUser<int> { // 按需添加自定义属性,无额外需求可留空 }更新DbContext,适配int主键的用户类
把继承的IdentityDbContext改成带泛型参数的版本,指定用户类、角色类(同样用int主键)和主键类型:public class ApplicationDbContext : IdentityDbContext<ApplicationUser, IdentityRole<int>, int> { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } }要是项目里用到了
IdentityUserClaim、IdentityUserRole等其他Identity实体,也要同步改成int泛型版本(比如IdentityUserClaim<int>),如果DbContext里声明了这些实体的DbSet,记得更新类型。调整服务配置(Startup/Program.cs)
在注册Identity服务时,指定我们的自定义用户类和int主键的角色类:
用AddDefaultIdentity的场景:builder.Services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders();用
AddIdentity的场景:builder.Services.AddIdentity<ApplicationUser, IdentityRole<int>>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders();创建并执行数据库迁移
打开终端或包管理器控制台,先创建迁移文件:Add-Migration ChangeAspNetUsersPrimaryKeyToInt再执行迁移更新数据库:
Update-Database⚠️ 注意:如果是已有数据的数据库,一定要先备份数据。修改主键类型会影响关联的外键表(比如AspNetUserClaims、AspNetUserRoles等),需要手动处理数据映射(比如给现有用户分配唯一int主键,同步更新外键字段的值);如果是全新数据库,直接执行迁移即可。
更新项目中其他相关代码
所有用到IdentityUser的地方,都要替换成ApplicationUser,比如用户管理器的注入、登录注册逻辑:// 原来的UserManager<IdentityUser>替换为UserManager<ApplicationUser> private readonly UserManager<ApplicationUser> _userManager; public AccountController(UserManager<ApplicationUser> userManager) { _userManager = userManager; }视图文件里的相关注入也要同步更新,比如
@inject UserManager<ApplicationUser> UserManager
内容的提问来源于stack exchange,提问作者Ajmal-Hossain

