实体框架一对多TPH映射

时间:2013-12-19 09:10:48

标签: c# entity-framework ef-code-first entity-framework-6

我正在使用类似于此的数据结构,其中动物的类型是从表中的鉴别器列确定的:

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更接近我想要的!)

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:0)

我不是EF专家,但从模型优先方法我知道这将被映射为Animal的集合,然后您可以选择Farm.Animals.OfType<Pig>()