实体框架代码第一个TPH复制/ redundent Discriminator列?

时间:2014-11-04 02:37:30

标签: entity-framework ef-code-first

我已按照此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?

1 个答案:

答案 0 :(得分:0)

UPD:我有同样的问题。 您可以通过添加第三个选项来删除减少识别器:

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的错误。