如何为带强类型ID的IdentityUser配置IdentityDbContext
问题:为带强类型ID的IdentityUser配置IdentityDbContext
我正尝试在应用中添加IdentityDbContext,其中用户以强类型ID作为主键。已知IdentityDbContext必须接收IdentityUser或其子类对象,想知道如何为带有强类型ID的IdentityUser配置IdentityDbContext?
当前上下文代码如下:
public class InstagramDbContext : IdentityDbContext<User, IdentityRole<Guid>, UserId> { // some code }
InstagramDbContext存在错误。
用户及强类型ID定义代码:
public record UserId(Guid Value); public class User : IdentityUser<UserId> { public UserId UserId { get; set; } = null!; }
解决方法
要实现带强类型ID的IdentityUser配置,按以下步骤调整:
统一Identity体系的类型匹配
当前代码中角色用IdentityRole<Guid>,用户用UserId作为主键类型,二者类型不匹配会引发错误。需定义使用UserId作为主键的角色类,并同步DbContext的泛型参数:// 自定义角色类,使用UserId作为主键 public class Role : IdentityRole<UserId> { } // 更新DbContext泛型参数,确保用户、角色、主键类型统一 public class InstagramDbContext : IdentityDbContext<User, Role, UserId> { public InstagramDbContext(DbContextOptions<InstagramDbContext> options) : base(options) { } }移除重复属性并配置值转换
IdentityUser<UserId>基类已自带Id属性,自定义的UserId属性属于重复定义,需删除。同时要让EF Core识别强类型ID和数据库中Guid类型的映射,在OnModelCreating中配置值转换器:public record UserId(Guid Value); public class User : IdentityUser<UserId> { // 移除重复的UserId属性,使用基类的Id即可 // 可在此添加其他自定义业务属性 } // 在DbContext的OnModelCreating中添加配置 protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // 配置用户ID的转换逻辑 modelBuilder.Entity<User>() .Property(u => u.Id) .HasConversion( id => id.Value, dbValue => new UserId(dbValue)); // 配置角色ID的转换逻辑 modelBuilder.Entity<Role>() .Property(r => r.Id) .HasConversion( id => id.Value, dbValue => new UserId(dbValue)); }同步身份服务配置
在Program.cs中配置Identity时,明确指定用户、角色类型:builder.Services.AddIdentity<User, Role>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<InstagramDbContext>() .AddDefaultTokenProviders();
内容的提问来源于stack exchange,提问作者sandro revazishvili
相关产品推荐
相关产品推荐

