Можно ли иметь наследование TPH с использованием перекрывающихся столбцов в подклассах? - PullRequest
2 голосов
/ 29 августа 2011

Сущности

public abstract class Person
{
  public string FirstName { get; set; }
  public string LastName { get; set; }
  public string WorkPhone { get; set; }
  public string Discriminator { get; set; }
}

public class Friend : Person
{
  public string HomePhone { get; set; }
}

public class Family : Person
{
  public string CellPhone { get; set; }
}

public class Colleague : Person
{
  // No home phone
}

Отображения

public class PersonMap : EntityTypeConfiguration<Person>
{
  public PersonMap()
  {
    Property(t => t.FirstName).HasColumnName("First_Name");
    Property(t => t.LastName).HasColumnName("Last_Name");
    Property(t => t.WorkPhone).HasColumnName("Work_Phone");

    Map<Friend>(m => m.Requires("Discriminator").HasValue("Friend");
    Map<Family>(m => m.Requires("Discriminator").HasValue("Family");
    Map<Colleague>(m => m.Requires("Discriminator").HasValue("Colleague");
  }
}

public class FriendMap : EntityTypeConfiguration<Friend>
{
  public FriendMap()
  {
    Property(t => t.HomePhone).HasColumnName("Home_Phone");
  }
}

public class FamilyMap : EntityTypeConfiguration<Family>
{
  public FamilyMap()
  {
    Property(t => t.CellPhone).HasColumnName("Home_Phone");
  }
}

Примечание : ColleagueMap не имеет сопоставления для"Home_Phone"

DbContext

public override void OnModelCreating(DbModelBuilder modelBuilder)
{
  ...
  modelBuilder.Configurations.Add(new PersonMap());
  modelBuilder.Configurations.Add(new FriendMap());
  modelBuilder.Configurations.Add(new FamilyMap());
  ...
}

Entity Framework говорит мне, что я не могу сопоставить два свойства одному столбцу:

System.Data.MetadataException: указанная схема недопустима.Ошибки: каждое имя свойства в типе должно быть уникальным.Имя свойства 'Home_Phone' уже определено.

Я не могу найти никаких примеров наследования TPH, когда несколько подклассов отображают разные свойства в одни и те же столбцы.Возможно ли это в EF?

Ответы [ 2 ]

3 голосов
/ 29 августа 2011

Короткий ответ - нет.Каждое свойство должно иметь свой собственный столбец.Невозможно отобразить несколько свойств в иерархии наследования в один и тот же столбец.

1 голос
/ 06 июня 2013

Теперь это возможно с EF6, см .: https://entityframework.codeplex.com/workitem/583

...