2014-11-04 129 views
1

我已经按照这个SO链接Entity Framework: How to avoid Discriminator column from table?接受的答案创建了多个类型的名为TPH实体的单个表。实体框架代码第一个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”的鉴别符,但是,存在具有数据“(Undefined)”的列“鉴别符”。

如果我有像流利API代码: .MAP(M => m.Requires( “鉴别”)的HasValue( “G”)) .MAP(M => m.Requires( “鉴别”) .HasValue( “C”));

然后在表“实体”中,冗余列现在被命名为“Discriminator1”。

这里是我的流利的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都是抽象的。

如何有适当的TPH没有多余的Disscriminator列?

回答

0

UPD:我有同样的问题。 您可以通过添加第三个选项等清除redurant鉴别:

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")); 

和列“鉴别”消失。 我认为这是一个EF的错误。