【发布时间】:2013-01-08 20:31:01
【问题描述】:
有没有一种方法可以装饰您的 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);
}
这是另一个非常相似的线程,以防在这种情况下对其他人有帮助,但它仍然无法处理对扩展方法的下一个调用。
Entity framework linq query Include() multiple children entities
【问题讨论】:
-
Nathan,非常有趣的挑战。请解释为什么您希望/需要避免使用 include() 等主动加载技术。
-
不,你不能,但没有什么能阻止你在 DbContext 或存储库类中创建像
DbQuery<Car> CompleteCars { get { return ...(你的长Include链)这样的属性。如果可以的话,这不会切断从数据库中获取“裸车”的可能性吗? -
我想避免这种情况,因为我有一个复杂的模型,但记录很少,所以我希望数据能够快速加载,但不想错过应用程序中任何包含孙子的任何内容。
标签: entity-framework-4.1 entity code-first entity-framework-4.3