有没有办法装饰你的 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 有类似的情况,它有很多我不想在任何地方都包含的部分。我可以做这样的事情吗?(我还没有找到一种可行的方法)。这样,如果以后我发现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);
}
这是另一个非常相似的线程,以防在这种情况下对其他人有帮助,但它仍然无法处理对扩展方法的下一个调用。