Могу ли я указать столбец дискриминатора с сопоставление таблиц по типам?

У меня есть иерархия классов, которую я хочу сопоставить с несколькими таблицами, используя 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; }
}

Это довольно слабый пример, но я надеюсь, что он имеет смысл. Будет таблица «События», таблица «Группы» и таблица для каждого типа вечеринки. Однако столбец дискриминатора («Код») будет иметь известное значение для каждого типа событий, например «РОЖДЕНИЕ» для дней рождения или «СВАДЬБА» для свадебных вечеринок.

Идея состоит в том, что если я запрашиваю только дни рождения в заданную дату 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», что неверно. Я уже сказал ему, что столбец «Код» находится в таблице «События»

Возможно ли это вообще? Могу ли я совместить использование столбца дискриминатора с сопоставлением таблиц по типам?

17
задан Matt Hamilton 22 August 2011 в 00:54
поделиться