2011-08-29 75 views
2

實體是否有可能在子類中有重疊列使用的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"

沒有映射的DbContext

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

實體框架是告訴我,我不能兩個屬性映射到同一列:

System.Data.MetadataException:指定的架構是無效的。錯誤: 類型中的每個屬性名稱都必須是唯一的。物業名稱 'Home_Phone'已被定義。

我找不到任何TPH繼承的例子,其中多個子類將不同的屬性映射到相同的列。這在EF中可能嗎?

+0

你一定要明白,你有不一致的對象模型開始,不是嗎?我不希望(甚至不讚賞)ORM支持這一點。 –

+0

我的問題遠遠超出了這裏顯示的不一致性,但這並不真正相關。我無權改變根本原因,這就是爲什麼我問是否有可能實現這一點。 –

回答

3

簡短的回答是沒有。每個屬性都必須有自己的列。無法將繼承層次結構中的多個屬性映射到同一列。

+0

現在可以! – Ben

相關問題