EF Core中如何忽略继承自User基类的派生类新增属性?
EF Core 忽略派生类新增属性的解决方案
问题场景
现有供EF Core使用的User基类及其配置:
基类代码
public class User { public int Id { get; set; } public string FirstName { get; set; } public string ClientVersion { get; set; } public string LastUsedByClient { get; set; } }
基类配置
public class UserConfiguration: IEntityTypeConfiguration<User> { public void Configure(EntityTypeBuilder<User> builder) { builder.ToTable("Users"); builder.HasKey(x => x.Id); builder.Property(x => x.Id).HasColumnName("UserId"); builder.Property(x => x.FirstName).HasColumnName("FirstName"); builder.Ignore(x => x.ClientVersion); builder.Ignore(x => x.LastUsedByClient); } }
派生扩展类UserRequest并新增属性:
public class UserRequest : User { public DateTime UpdateDate { get; set; } public bool Status { get; set; } }
需求:不修改原有UserConfiguration的前提下,通过Context.Users.Add(UserRequest);添加数据时,忽略UserRequest中的新增属性。
解决方案
方法1:为派生类创建独立配置类
创建针对UserRequest的配置类,继承IEntityTypeConfiguration<UserRequest>,在其中忽略新增属性。EF Core会自动合并基类与派生类的配置,无需修改原有代码。
public class UserRequestConfiguration : IEntityTypeConfiguration<UserRequest> { public void Configure(EntityTypeBuilder<UserRequest> builder) { // 忽略派生类新增的两个属性 builder.Ignore(x => x.UpdateDate); builder.Ignore(x => x.Status); } }
在DbContext的OnModelCreating方法中应用该配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 保留原有基类配置 modelBuilder.ApplyConfiguration(new UserConfiguration()); // 添加派生类配置 modelBuilder.ApplyConfiguration(new UserRequestConfiguration()); }
方法2:直接在DbContext中配置派生类
如果不想单独创建配置类,也可以直接在OnModelCreating中对UserRequest进行配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.ApplyConfiguration(new UserConfiguration()); // 直接忽略派生类的新增属性 modelBuilder.Entity<UserRequest>() .Ignore(x => x.UpdateDate) .Ignore(x => x.Status); }
原理说明
EF Core支持对继承层次中的每个实体类型单独配置,派生类的配置会叠加在基类配置之上。以上两种方式都能在保留原有User配置的同时,让EF Core忽略UserRequest的新增属性,满足不修改原有代码的需求。
内容的提问来源于stack exchange,提问作者user8512043
相关产品推荐
相关产品推荐

