最佳答案
有没有一种方法可以装饰您的 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 类或在我的 OnModelCreating()
或设置一个配置在 EF,将告诉它只是加载我的汽车的所有部件,当我加载我的汽车?我急切地想这样做,所以我的理解是,让我的导航属性虚拟化是不可能的。我知道 NHibernate 也支持类似的功能。
只是想知道我是不是漏掉了什么,提前谢谢你!
干杯,
内森
我喜欢下面的解决方案,但 我想知道是否可以嵌套对扩展方法的调用。举例来说,假设我有一个类似的情况与引擎,它有许多部分,我不想包括在任何地方。我能做这样的事吗?(我还没找到解决办法)。这样,如果以后我发现 Engine 需要 FuelInjectors,我可以只在 BuildEngine 中添加它,而不必在 BuildCar 中也添加它。另外,如果我可以嵌套调用,那么如何嵌套对集合的调用?喜欢在 BuildCar ()中为每个轮子调用 BuildWheal()吗?
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);
}
下面是另一个非常类似的线程,以防在这种情况下它对其他任何人都有帮助,但是它仍然不能处理对扩展方法的下一个调用。