了解EF Code-First急切加载

时间:2012-11-12 15:10:45

标签: entity-framework ef-code-first lazy-loading eager-loading

自从EF 4.1上线以来,我一直在使用EF CodeFirst,这已经超过一年了,我现在感觉非常舒服。我习惯于自定义实体验证器,重写.SaveChanges()来修改它的一些行为以及一些非平凡的概念,比如映射到不可用的db对象。但是EF的这部分对我来说仍然是阴天:context.Configuration.LazyLoadingEnabled = false;

我理解基础知识,一旦调用它们就会抛出linq查询到数据库,如果我没有明确指定依赖集合,yadda yadda yadda。 我想要了解的是:

  • 在什么情况下我应该禁用延迟加载?为什么?
  • 禁用它的实际好处和/或缺点是什么?
  • 欢迎任何其他澄清。

1 个答案:

答案 0 :(得分:0)

EF v1不支持延迟加载。当在第二轮中添加延迟加载(它是EF4)时,在将使用EF v1编写的应用程序移植到EF4时可能会出现问题,而在之前没有发生的情况下突然会有更多的查询被发送到数据库。因此,使EF v1在EF4上运行的最简单方法是禁用延迟加载。

另一件有趣的事情是看看如何实现延迟加载 - EF将动态创建一个从您的实体类型派生的类型,并将添加一些代码来处理延迟加载。这意味着EF实际上并不使用您的类型,而是从您的类型派生的类型。这通常没问题但有时可能会引起问题。

最后,有时您可能希望控制查询何时实际发送到数据库(例如,由于使用Sql Azure时的延迟,通常更好/更快地发送一个查询返回更大的结果而不是大量查询返回更小的结果)。在延迟加载的情况下,人们通常不会意识到,当它们没有必要或没有效果时,它们会很难打到数据库。有一件事需要注意,你可以混合两个世界 - .Include()将强制加载相关的实体,无论延迟加载设置如何。

您可以在此处详细了解此信息:http://thedatafarm.com/blog/data-access/a-look-at-lazy-loading-in-ef4/和此处:http://msdn.microsoft.com/en-us/magazine/hh205756.aspx