Frameworks 实体框架映射具有集合和TPH固有属性的外键

Frameworks 实体框架映射具有集合和TPH固有属性的外键,frameworks,foreign-keys,mapping,entity,tph,Frameworks,Foreign Keys,Mapping,Entity,Tph,我尝试将此简单模型映射为TPH继承: public abstract class Master { public long Id { get; set; } public virtual ICollection<Detail> Details { get; set; } } public class MasterA : Master { public string Fi

我尝试将此简单模型映射为TPH继承:

    public abstract class Master {
    public long Id {
        get;
        set;
    }
    public virtual ICollection<Detail> Details {
        get;
        set;
    }

}

public class MasterA : Master {
    public string FieldA {
        get;
        set;
    }
}

public class MasterB : Master {
    public string FieldB {
        get;
        set;
    }
}

public abstract class Detail {
    public long Id {
        get;
        set;
    }
    public long MasterId {
        get;
        set;
    }
    public Master Master {
        get;
        set;
    }
    public String CommonDetailInfo {
        get;
        set;
    }
}

public class DetailA : Detail {
    public MasterA MasterA {
        get;
        set;
    }

    public string SpecificA {
        get;
        set;
    }
}

public class DetailB : Detail {
    public MasterB MasterB {
        get;
        set;
    }
    public string SpecificB {
        get;
        set;
    }
}
但这两个字段总是空的和冗余的,因为基本Dteail类上的MasterId字段做相同的工作

如果我从数据库中删除这些字段并尝试获取主记录的详细信息,如下所示:

modelBuilder.Entity<Master>().ToTable("TestMaster");
        modelBuilder.Entity<Master>().Property(m => m.Id)
                                     .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        modelBuilder.Entity<Master>().HasKey(m => m.Id);
        modelBuilder.Entity<Master>().Map<MasterA>(m => m.Requires("MasterType").HasValue("A"));
        modelBuilder.Entity<Master>().Map<MasterB>(m => m.Requires("MasterType").HasValue("B"));

        modelBuilder.Entity<Detail>().ToTable("TestDetail");
        modelBuilder.Entity<Detail>().Property(d => d.Id)
                                     .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        modelBuilder.Entity<Detail>().HasKey(d => d.Id);
        modelBuilder.Entity<Detail>().Map<DetailA>(m => m.Requires("DetailType").HasValue("A"));
        modelBuilder.Entity<Detail>().Map<DetailB>(m => m.Requires("DetailType").HasValue("B"));

        modelBuilder.Entity<Master>()
            .HasMany(m => m.Details)
            .WithRequired(d => d.Master)
            .HasForeignKey(f => f.MasterId)
            .WillCascadeOnDelete();
  foreach (var detail in master.Details) {...}
引发异常:当我访问“详细信息”属性时,列名MasterA_Id、MasterB_Id无效

我做错了什么? 在数据库中没有这两个字段的情况下,如何在TPH模式下映射此模型

谢谢你的帮助

  foreach (var detail in master.Details) {...}