实体框架中的延迟加载是加载和访问相关实体时发生的默认现象。然而,急切加载是指强制加载所有这些关系的做法。我遇到的问题是,在什么情况下,急切加载可能比延迟加载更有益。问这个,因为很明显延迟加载更加资源友好,即使我们使用ToList()
方法,我们仍然可以利用延迟加载行为。但是,我认为可能延迟加载会增加对实际数据库的请求数量,这可能就是为什么有时开发人员使用Inlcude
方法强制加载所有关系。例如,在MVC 5中使用Visual Studio自动搭建时,在控制器中自动创建的Index方法总是使用Eager Loading,而且我总是有一个问题,即在这种情况下Microsoft默认使用Eager Loading。
如果有人向我解释,在什么情况下,渴望加载比延迟加载更有益,我会很感激,为什么我们一直使用它,而有些资源更友好,如Lazy Loading。
答案 0 :(得分:57)
我认为对这样的关系进行分类是好的
何时使用预先加载
何时使用延迟加载
注意:就像Transcendent所说,延迟加载可能会出现处理问题。
答案 1 :(得分:15)
渴望加载: Eager Loading可帮助您一次加载所有需要的实体。即相关对象(子对象) 自动加载其父对象。
何时使用:
延迟加载: 在延迟加载的情况下,不会自动加载相关对象(子对象) 使用其父对象,直到请求它们为止。 默认情况下,LINQ支持延迟加载。
何时使用:
注意:Entity Framework支持三种加载相关数据的方法 - 急切加载,延迟加载和显式加载。
答案 2 :(得分:13)
延迟加载会产生多个SQL调用,而Eager加载可能会加载一个“更重”调用(带有连接/子查询)的数据。
例如,如果您的Web和SQL服务器之间存在高ping,您将使用Eager加载,而不是使用延迟加载逐个加载相关项目。
答案 3 :(得分:10)
考虑以下情况
public class Person{
public String Name{get; set;}
public String Email {get; set;}
public virtual Employer employer {get; set;}
}
public List<EF.Person> GetPerson(){
using(EF.DbEntities db = new EF.DbEntities()){
return db.Person.ToList();
}
}
现在调用此方法后,您无法再延迟加载Employer
实体。为什么?因为db
对象被处置掉了。所以你必须Person.Include(x=> x.employer)
强制加载它。
答案 4 :(得分:2)
渴望加载 例如,当您确定要一次获取多个实体时,必须在同一页面上显示用户和用户详细信息,那么就应该急于加载。 渴望的加载使数据库一炮而红,并加载了相关实体。
延迟加载 当您只需要在页面上显示用户,并且通过单击用户需要显示用户详细信息时,则需要进行延迟加载。 延迟加载会产生多次点击,以在绑定/迭代相关实体时加载相关实体。
答案 5 :(得分:2)
延迟加载-在进行分页处理时非常有用,例如页面加载时显示的用户列表包含10个用户,并且当用户向下滚动页面时api调用会带来接下来的10个用户。您不希望立即加载enit数据,因为这会花费更多时间,并且会带来糟糕的用户体验。
快速加载-很好,就像其他人建议的那样,当关系不多并且一次调用数据库一次获取全部数据时
答案 6 :(得分:0)
list[a][b][1]
答案 7 :(得分:-1)
最好使用预加载,因为它可以优化应用程序的性能。
ex-:
Eager loading
var customers= _context.customers.Include(c=> c.membershipType).Tolist();
lazy loading
在模型中,客户必须定义
Public virtual string membershipType {get; set;}
因此,在查询延迟加载时,加载所有参考对象要慢得多,但是渴望加载查询并仅选择相关的对象。