EF Core 8.0.2配置Table-Per-Hierarchy遇异常,求解决方案
EF Core 8.0.2 TPH模式配置问题解答
可以完全通过IEntityTypeConfiguration<T>实现TPH配置,你遇到的报错是配置逻辑错误导致的,无需将配置移至OnModelCreating。
错误原因
你的报错提示“无法为实体类型ConcreteItemB配置鉴别器值,因为它不派生自ConcreteItemA”,大概率是以下两种情况:
- 实体继承关系错误:
ConcreteItemB意外继承自ConcreteItemA而非共同基类(比如Item) - 鉴别器配置位置错误:在派生类的配置类中尝试单独配置鉴别器,而非统一在基类配置中声明
正确配置方式
1. 确认实体继承结构
确保所有具体实体都继承自同一个抽象基类,而非互相继承:
// 基类(抽象类,TPH的共享表对应实体) public abstract class Item { public int Id { get; set; } public string CommonField { get; set; } } // 具体实体A public class ConcreteItemA : Item { public string UniqueFieldA { get; set; } } // 具体实体B public class ConcreteItemB : Item { public string UniqueFieldB { get; set; } }
2. 基类配置类中统一配置鉴别器
鉴别器的规则(列名、各派生类对应值)必须在基类的配置类中声明,派生类仅配置自身独有属性:
// 基类配置类:负责TPH核心规则 public class ItemConfiguration : IEntityTypeConfiguration<Item> { public void Configure(EntityTypeBuilder<Item> builder) { // 配置鉴别器列及各实体对应值 builder.HasDiscriminator<string>("ItemType") .HasValue<ConcreteItemA>("TypeA") .HasValue<ConcreteItemB>("TypeB"); // 配置基类公共属性 builder.Property(x => x.CommonField).HasMaxLength(100).IsRequired(); } } // 派生类A配置类:仅处理自身属性 public class ConcreteItemAConfiguration : IEntityTypeConfiguration<ConcreteItemA> { public void Configure(EntityTypeBuilder<ConcreteItemA> builder) { builder.Property(x => x.UniqueFieldA).HasMaxLength(50); } } // 派生类B配置类:仅处理自身属性 public class ConcreteItemBConfiguration : IEntityTypeConfiguration<ConcreteItemB> { public void Configure(EntityTypeBuilder<ConcreteItemB> builder) { builder.Property(x => x.UniqueFieldB).HasMaxLength(50); } }
3. DbContext中加载所有配置
在OnModelCreating中批量加载配置类即可,无需额外编写TPH相关逻辑:
public class AppDbContext : DbContext { public DbSet<Item> Items { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 加载当前程序集下所有IEntityTypeConfiguration实现类 modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly); } // 配置数据库连接等其他逻辑 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("你的连接字符串"); } }
内容的提问来源于stack exchange,提问作者David Keaveny
相关产品推荐
相关产品推荐

