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