实体框架:我可以包含()子类型的属性吗?

时间:2016-12-12 16:49:11

标签: c# entity-framework

我在我的EF项目中设置了TPT继承,其中包含一个超类型和两个子类型。我希望获得超类型的所有对象和Include()子类型的导航属性,以达到此效果(更改类名以保护困惑):

var thelist = DataContext.Fleets
    .Include(x => x.Vehicles.Select(y => y.EngineData)) // Not specific to Car or Truck
    .Include(x => x.Vehicles.OfType<Car>().Select(y => y.BultinEntertainmentSystemData)) // Only Cars have BultinEntertainmentSystemData
    .ToList();

所以,我想获得所有车辆,包括车辆是汽车时内置娱乐系统的信息。我已经看到,如果我直接从DbSet开始,这是可行的,但在这里我正在查看Fleet对象的集合属性。当我在集合属性上使用带有OfType()调用的Include()调用时,我会收到此异常消息:

  

Include路径表达式必须引用在类型上定义的导航属性。使用虚线路径作为参考导航属性,使用Select运算符作为集合导航属性。

是否可以在集合属性中包含()子类型的属性?

1 个答案:

答案 0 :(得分:2)

你不能做你正在尝试的事情,因为你正在写的查询是&#34;翻译&#34;到SQL。没有&#34; OfType&#34; SQL和OfType中的方法未设置为对象的属性,因此您会收到此错误。理想情况下,EF会将此转换为仅表示从包含Type Car的表中获取数据,但事实并非如此。

如果在父级上添加指示类型的属性,则可以使用该属性进行导航。

public class Vehicle
{
    public string Type {get; set;} //you need the setter here for EF
}

public class Car : Vehicle
{
    public Car()
    {
        Type = "Car";
    }
}

DataContext.Fleets
    .Include(x => x.Vehicles.Select(y => y.EngineData)) // Not specific to Car or Truck
    .Include(x => x.Vehicles.Where(x => x.Type == "Car").Select(y => y.BultinEntertainmentSystemData)) // Only Cars have BultinEntertainmentSystemData
    .ToList();

这只是我现在想出来的,你可能需要改进它。使用字符串来定义这样的东西可能并不理想,尝试将其作为枚举等等。