2013-12-19 193 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