entity-framework-4.1 – 我可以使用每个类型映射指定一个标识符列吗?

我有一个类层次结构,我想使用Entity Framework 4.1 Code First映射到多个表。就像桌上型(TPT),但我也想要一个辨别器列。

层次结构看起来像:

public class Event
{
    public Guid Id { get; set; }
    public string Code { get; set; } // discriminator
    public DateTime Date { get; set; }
}

public class Party : Event
{
    public int AttendeeCount { get; set; }
}

public class BirthdayParty : Party
{
    public int Age { get; set; }
}

public class WeddingParty : Party
{
    public string Surname { get; set; }
}

这是一个很弱的例子,但我希望它是有道理的。将有一个“活动”表,一个“派对”表和每一方的表。然而,鉴别器列(“代码”)对于每种类型的事件将具有已知值,例如生日聚会的“BIRTH”或“婚礼”的“婚礼”。

这个想法是,如果我在给定的日期查询生日聚会,EF会知道为我的查询添加Code =’BIRTH’,而不是一系列UNION和JOIN来计算出需要哪些行。

我映射我这个最低级别的类:

var bd = modelBuilder.Entity<BirthdayParty>();
bd.ToTable("BirthdayParties");
bd.Property(p => p.Age).HasColumnName("BirthdayAge");

我现在需要以某种方式指定鉴别器值。我试过这个:

modelBuilder.Entity<Event>().Map<BirthdayParty>(cfg =>
    {
        cfg.Requires("Code").HasValue("BIRTH");
    });

…但是抱怨我没有在调用Map中指定表名。所以我试着把ToTable调用到那里:

var bd = modelBuilder.Entity<BirthdayParty>();
bd.Property(p => p.Age).HasColumnName("BirthdayAge");

modelBuilder.Entity<Event>().Map<BirthdayParty>(cfg =>
    {
        cfg.Requires("Code").HasValue("BIRTH");
        cfg.ToTable("BirthdayParties");
    });

…现在它认为我想在“BirthdayParties”表中的“代码”列,这是不正确的。我已经告诉它,“代码”列在“事件”表中。

这是甚么可能吗?我可以将辨别器列的使用与每种类型的映射相结合吗?

不幸的是,这不支持。鉴别柱只能在TPH中使用。 TPT通过映射表来区分实体类型,它总是产生这些可怕的查询。这可能是很好的功能,所以也许建议在Data UserVoice将使它实施一天。

更新

这个题为“Discriminator column support in TPT inheritance”的用户声音已经有一个建议。

翻译自:https://stackoverflow.com/questions/7142214/can-i-specify-a-discriminator-column-with-a-table-per-type-mapping

转载注明原文:entity-framework-4.1 – 我可以使用每个类型映射指定一个标识符列吗?