ASP.NET Core Code First操作Oracle无法生成派生类表的问题求助
解决EF Core继承映射仅生成基表的问题
核心原因
EF Core默认不会自动识别未注册的派生实体类型,导致迁移时仅生成基类对应的表。需要确保派生类被DbContext正确识别,并配置合适的继承映射策略。
具体解决步骤
1. 确保DbContext识别派生类
有两种方式实现:
- 添加派生类的DbSet:在你的DbContext类中添加以下属性:
public DbSet<Ordreinterventionexterne> Ordreinterventionexternes { get; set; } public DbSet<Ordreinterventioninterne> Ordreinterventioninternes { get; set; } - 在OnModelCreating中显式注册实体:如果不想添加DbSet,可在DbContext的
OnModelCreating方法中指定实体类型:protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Ordreinterventionexterne>(); modelBuilder.Entity<Ordreinterventioninterne>(); }
2. 选择并配置继承映射策略
根据业务需求选择以下三种策略之一:
策略一:TPH(表每层次,默认)
所有继承层次的实体存储在同一张基表中,通过自动生成的Discriminator列区分不同类型。此策略无需额外配置,只要派生类被识别,迁移后基表会包含所有派生类的字段(如Codefournisseur、Codedepartementdmet)。
策略二:TPT(表每类型)
每个实体类对应单独的表,基表存储公共字段,派生表存储特有字段,通过主键关联。需要在OnModelCreating中配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 基类映射到原表 modelBuilder.Entity<Ordreintervention>().ToTable("Ordreintervention"); // 派生类分别映射到单独表 modelBuilder.Entity<Ordreinterventionexterne>().ToTable("Ordreinterventionexterne"); modelBuilder.Entity<Ordreinterventioninterne>().ToTable("Ordreinterventioninterne"); }
执行迁移后会生成三张表,派生表通过Id外键关联基表。
策略三:TPC(表每具体类)
每个派生类对应单独的表,每张表包含基类的所有字段,不生成基表。配置方式:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Ordreinterventionexterne>().UseTpcMappingStrategy(); modelBuilder.Entity<Ordreinterventioninterne>().UseTpcMappingStrategy(); }
迁移后会生成两张表,每张表都包含Id、Typeordre、Dated以及各自的特有字段。
3. 重新执行迁移命令
- 若需要清理之前的无效迁移,先执行:
Remove-Migration - 重新生成迁移:
Add-Migration InheritanceFix - 更新数据库:
Update-Database
内容的提问来源于stack exchange,提问作者jaouadi
相关产品推荐
相关产品推荐

