You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 00:40:18