Возможно ли наследование TPH с использованием перекрывающихся столбцов в подклассах?

Объекты

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".

Дбконтекст

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?


person Jeff Swensen    schedule 29.08.2011    source источник
comment
Вы понимаете, что у вас изначально несогласованная объектная модель, не так ли? Я бы не ожидал (и даже не оценил) ORM для поддержки этого.   -  person Henk Holterman    schedule 29.08.2011
comment
Мои проблемы выходят далеко за рамки показанного здесь несоответствия, но это не очень важно. Я не вправе изменять первопричины, поэтому я спрашиваю, возможно ли реализовать это.   -  person Jeff Swensen    schedule 29.08.2011


Ответы (2)


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

person Ladislav Mrnka    schedule 29.08.2011
comment
теперь это возможно! - person Ben; 20.01.2017

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

person Ben    schedule 06.06.2013