实体框架中的延迟加载,延迟加载和预先加载

时间:2010-07-12 17:03:00

标签: entity-framework orm entity-framework-4

这3种装载有什么区别?有人能解释一个例子吗?不同的在线资源使用不同的定义,导致更多的混淆。

3 个答案:

答案 0 :(得分:9)

延迟加载和延迟是相当的同义词(AFAIK,如果我错了,请纠正我)。 Eager和Lazy之间的最大区别。渴望将在前面发生,懒惰只在“按需”发生,执行将在DB级别发生 - 让我们以一个简单的JOIN语句为例

var people = (from p in people SELECT p).ToList();
var jobs = (from j in jobs SELECT j).ToList();

var peopleAndJobs = (from p in people JOIN j on j.personId equals p.personId SELECT p).ToList()

这是急切加载的一个例子。我们得到所有人,所有工作,我们正在加入记忆。不是很聪明(通常)。这就是懒惰风格。

var people = (from p in people SELECT p);
var jobs = (from j in jobs SELECT j);

var peopleAndJobs = (from p in people JOIN j on j.personId equals p.personId SELECT p).ToList()

这样做是为人和工作创建一个IQueryable(IQueryable是懒惰的),并且连接发生在数据库中。这节省了网络活动,并且通常实际上更快,因为DB已经过优化以进行连接等。

除非我们明确说“我需要那些数据!” (通过ToListing,迭代它等)它是懒惰的。还有一些更多的怪癖,但这应该是一个不错的入门。

答案 1 :(得分:3)

延迟/延迟加载:延迟加载和延迟加载是一回事。第一次访问时会加载该关系。我们的想法是,如果不需要数据,则不应加载。

急切加载:与Parent对象一起提取关系。这在加载数据时可以更有效,但无论使用/未使用的数据如何,都将加载数据。

答案 2 :(得分:0)

当查询返回对象时,不会同时加载相关对象。

而是在访问导航属性时自动加载它们。也称为“延迟加载”,