在什么情况下,Entity Framework会在您使用子行和其他相关行时自动加载它们?似乎有时这会在属性访问器上自动完成,有时您必须明确地执行此操作。
例如,如果我有一个名为 Car 的表,以及一个名为 Wheel 的表,并且每个车行有4个轮子行,那么EF会自动加载当我访问 myCar.Wheel 时,滚轮行,或者是首先调用 myCar.Wheel.Load()的一般做法?
答案 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();
}
直接来自:
答案 2 :(得分:0)
在实体框架版本1(又名3.5)中,只有三种情况,EF可能会从相关表中加载数据:
上述所有三种方案都要求您明确指定要加载相关的表数据。据我所知,EF v1将永远不会“幕后”而没有你请求它(这可以看作是积极的,但它不是其他现代ORM的工作方式,他们在版本2中更改了它 - 也就是版本4.0)。