有没有办法装饰您的POCO类以自动渴望加载子实体,而不必Include()
每次加载它们时都使用它们?
假设我有一辆有轮,门,引擎,保险杠,窗户,排气等复杂类型属性的类车。在我的应用中,我需要从DbContext的20个不同的地方加载汽车,并进行不同的查询,等等。不需要指定每次要加载汽车时都包含所有属性。
我想说
List<Car> cars = db.Car
.Where(x => c.Make == "Ford").ToList();
//NOT .Include(x => x.Wheels).Include(x => x.Doors).Include(x => x.Engine).Include(x => x.Bumper).Include(x => x.Windows)
foreach(Car car in cars)
{
//I don't want a null reference here.
String myString = car.**Bumper**.Title;
}
我可以以某种方式装饰我的POCO类或在我的POCO类中OnModelCreating()
设置还是在EF中设置一个配置,以告诉它在加载汽车时仅加载汽车的所有零件?我希望能做到这一点,所以我的理解是将导航属性设置为虚拟。我知道NHibernate支持类似的功能。
只是想知道我是否缺少什么。提前致谢!
干杯,
内森
我喜欢下面的解决方案,但想知道是否可以将对扩展方法的调用嵌套。例如,假设我在Engine上遇到类似的情况,其中有很多我不想包含在所有地方的零件。我可以做这样的事情吗?(我还没有找到一种可行的方法)。这样,如果以后发现Engine需要FuelInjectors,则可以仅将其添加到BuildEngine中,而不必也将其添加到BuildCar中。另外,如果可以嵌套调用,如何嵌套对集合的调用?是否想从BuildCar()中为每个车轮调用BuildWheel()?
public static IQueryable<Car> BuildCar(this IQueryable<Car> query) {
return query.Include(x => x.Wheels).BuildWheel()
.Include(x => x.Doors)
.Include(x => x.Engine).BuildEngine()
.Include(x => x.Bumper)
.Include(x => x.Windows);
}
public static IQueryable<Engine> BuildEngine(this IQueryable<Engine> query) {
return query.Include(x => x.Pistons)
.Include(x => x.Cylendars);
}
//Or to handle a collection e.g.
public static IQueryable<Wheel> BuildWheel(this IQueryable<Wheel> query) {
return query.Include(x => x.Rim)
.Include(x => x.Tire);
}
这是另一个非常相似的线程,以防在这种情况下对其他人有帮助,但是仍然无法处理扩展方法的后续调用。