实体框架 - 何时自动加载引用的关系?

时间:2010-01-08 14:13:19

标签: .net entity-framework

在什么情况下,Entity Framework会在您使用子行和其他相关行时自动加载它们?似乎有时这会在属性访问器上自动完成,有时您必须明确地执行此操作。

例如,如果我有一个名为 Car 的表,以及一个名为 Wheel 的表,并且每个车行有4个轮子行,那么EF会自动加载当我访问 myCar.Wheel 时,滚轮行,或者是首先调用 myCar.Wheel.Load()的一般做法?

3 个答案:

答案 0 :(得分:6)

在EF 4中,如果您使用代码生成或代理,则默认情况下会进行延迟加载。 “纯粹的”POCO(不要与所谓的POCO代理混淆)不能进行延迟加载,除非你编写代码。更多详细信息为in this post

在EF 1中,没有延迟加载,因此您必须使用显式加载,预先加载或投影。

显式加载意味着调用Load()。您通常在致电IsLoaded之前测试Load()

预先加载导致该属性与实体本身一起加载。这可以避免第二次数据库查询。

Projection使EF以优化的方式仅为您需要的属性生成SQL。

虽然在EF 4中默认启用了延迟加载,但在任何ORM中它都是相对低效的(导致许多数据库查询)。您可能仍希望使用投影或预先加载。

答案 1 :(得分:0)

使用实体框架时,一般的做法是检查子项是否已加载...如果没有,则加载它。

if (!order.SalesOrderDetail.IsLoaded)
{
    order.SalesOrderDetail.Load();
}

直接来自:

How to: Explicity Load Related Objects (Entity Framework)

答案 2 :(得分:0)

在实体框架版本1(又名3.5)中,只有三种情况,EF可能会从相关表中加载数据:

  1. 您在Linq查询中明确加入该表
  2. 您在Linq查询中使用Include语法(请参阅Linq-To-Entities Include
  3. 你使用Craig Stuntz的回答中描述的投影。
  4. 上述所有三种方案都要求您明确指定要加载相关的表数据。据我所知,EF v1将永远不会“幕后”而没有你请求它(这可以看作是积极的,但它不是其他现代ORM的工作方式,他们在版本2中更改了它 - 也就是版本4.0)。