2013-12-19 225 views
3

我使用類似於此,其中動物的類型是從表中的一個鑑別柱測定的數據結構:實體框架一對多映射TPH

public class Farm { 
    public int Id { get; set; } 

    public virtual ICollection<Pig> Pigs { get; set; } 

    public virtual ICollection<Cow> Cows { get; set; } 
} 

public class Animal { 
    public int Id { get; set; } 

    public int FarmId? { get; set; } 

    public virtual Farm Farm { get; set; } 

    public string Name { get; set; } 
} 

public class Pig : Animal {} 
public class Cow : Animal {} 

映射:

this.Map<Pig>(m => m.Requires("Type").HasValue((int) AnimalType.Pig)); 
this.Map<Cow>(m => m.Requires("Type").HasValue((int) AnimalType.Cow)); 

但我似乎無法確定豬,牛和農場之間的關係。我從FarmMap這給了重複的列映射錯誤嘗試這樣做:

this.HasMany(t => t.Pigs) 
    .WithOptional(t => t.Farm) 
    .Map(m => m.MapKey("FarmId")); 
this.HasMany(t => t.Cows) 
    .WithOptional(t => t.Farm) 
    .Map(m => m.MapKey("FarmId")); 

從每個動物的映射也不管用,它會產生額外的列(如Farm_IdFarm_Id1 - 除了FarmId - 。每個動物類型一個)。

this.HasOptional(t => t.Farm) 
    .WithMany(t => t.Pigs) 
    .HasForeignKey(d => d.FarmId) 

Animal模型的繼承機型移動導航屬性會導致產生一個附加列 - FarmId1(!那麼一點點接近我想要比上述2)

有任何方式來實現這一目標?

+0

你找到適合你的情況的任何解決方案,這就是我一直在尋找.. – c0demaster

回答

0

我沒有EF專家,但是從模型第一種方法,我知道,這將被映射爲動物的集合,則可以選擇Farm.Animals.OfType<Pig>()

+0

這不意味着整個動物集合從SQL Server加載,然後過濾到那些是豬? – Jamie

+0

(這是我試圖避免這個問題... http://stackoverflow.com/questions/20663337/entity-framework-filtered-navigation-properties) – Jamie