如何重写ABP IdentityUser属性并映射自定义数据库列名?
解决方案
问题核心
你遇到的Discriminator字段是因为EF Core检测到User继承自IdentityUser的层次关系,自动启用了TPH(单表继承)策略导致的。要实现代码中直接使用FirstName/LastName作为属性名,同时映射到数据库对应列,需要确保DbContext只使用自定义的User类作为唯一用户实体,而非同时保留IdentityUser的映射。
步骤1:创建自定义User类
直接定义包含FirstName和LastName的用户类,继承自IdentityUser,替换原有的Name/Surname属性:
public class User : IdentityUser { public string FirstName { get; set; } public string LastName { get; set; } }
步骤2:更新DbContext配置
移除原有的DbSet<IdentityUser>,替换为DbSet<User>,并在OnModelCreating中配置User实体:
public DbSet<User> Users { get; set; } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); // 配置User属性规则 builder.Entity<User>(b => { b.Property(x => x.FirstName).IsRequired(); b.Property(x => x.LastName).IsRequired(); // 若数据库列名与属性名一致,无需额外指定HasColumnName }); // 同步Identity相关配置(如角色关联) builder.Entity<IdentityUserRole<string>>().HasKey(r => new { r.UserId, r.RoleId }); }
步骤3:替换Identity服务配置
在Program.cs(或Startup.cs)中,配置Identity时指定使用自定义User类:
builder.Services.AddDefaultIdentity<User>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<YourDbContext>();
步骤4:处理迁移与数据库
- 生成新迁移:执行
Add-Migration ReplaceUserEntity命令 - 检查迁移文件,确保
Discriminator字段被移除,且FirstName/LastName列正确映射 - 若原有数据库存在
Name/Surname列,需在迁移中添加数据转移逻辑(如将Name数据同步到FirstName),避免数据丢失 - 执行
Update-Database应用迁移
备选方案(兼容原有IdentityUser属性)
如果必须保留Name/Surname属性作为代码别名,可将其标记为非映射属性,仅用FirstName/LastName映射数据库:
public class User : IdentityUser { [NotMapped] public string Name { get => FirstName; set => FirstName = value; } [NotMapped] public string Surname { get => LastName; set => LastName = value; } [Column("FirstName")] public string FirstName { get; set; } [Column("LastName")] public string LastName { get; set; } }
此方案需确保DbContext仅注册DbSet<User>,避免触发继承检测。
内容的提问来源于stack exchange,提问作者Jesus
相关产品推荐
相关产品推荐

