我已按照此SO链接Entity Framework: How to avoid Discriminator column from table?接受的答案来创建多个类型的名为TPH实体的单个表。
protected override void OnModelCreating(DbModelBuilder modelbuilder)
{
modelbuilder.Conventions.Remove<PluralizingTableNameConvention>();
// Example of controlling TPH iheritance:
modelBuilder.Entity<PaymentComponent>()
.Map<GiftPaymentComponent>(m => m.Requires("MyType").HasValue("G"))
.Map<ClubPaymentComponent>(m => m.Requires("MyType").HasValue("C"));
该应用程序实际上运行良好。但是,在表实体中,虽然“MyType”列保持像“G”和“C”这样的鉴别器,但是存在具有数据“(未定义)”的列“鉴别器”。
如果我有Fluent API代码,例如: .Map(m =&gt; m.Requires(“Discriminator”)。HasValue(“G”)) .Map(m =&gt; m.Requires(“Discriminator”)。HasValue(“C”));
然后在表“实体”中,冗余列现在被命名为“Discriminator1”。
以下是我的Fluent API代码:
public DbSet<Dealer> Dealers { get; set; }
public DbSet<Customer> Customers { get; set; }
public DbSet<Entity> Entities { get; set; }
public DbSet<BizEntity> BusinessEntities { get; set; }
public DbSet<Person> People { get; set; }
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
//Table per inheritence
modelBuilder.Entity<Entity>()
.Map<Customer>(d => d.Requires("Discriminator").HasValue("C"))
.Map<Dealer>(d => d.Requires("Discriminator").HasValue("D"))
.Map<Person>(d => d.Requires("Discriminator").HasValue("P")).ToTable("Entities");
人,客户和经销商是具体的类,而实体和BizEntity是抽象的。
如果没有冗余的Disscriminator列,如何获得正确的TPH?
答案 0 :(得分:0)
modelBuilder.Entity<PaymentComponent>()
.Map<GiftPaymentComponent>(m => m.Requires("MyType").HasValue("G"))
.Map<ClubPaymentComponent>(m => m.Requires("MyType").HasValue("C"));
.Map<SomePaymentComponent>(m => m.Requires("MyType").HasValue("S"));
专栏&#34; Discriminator&#34;消失了。 我认为这是EF的错误。