在什么情况下,急于加载比懒惰加载更有益?
实体框架中的延迟加载是加载和访问相关实体时发生的默认现象。然而,急切加载指的是强制加载所有这些关系的做法。
我问这个,因为很明显,延迟加载对资源更友好,即使我们使用ToList()
方法,我们仍然可以利用延迟加载行为。
但是,我想也许延迟加载会增加对实际数据库的请求数量,也许这就是为什么有时开发人员使用Inlcude
方法来强制加载所有关系。
例如,在 MVC 5 中使用 Visual Studio 自动脚手架时,在控制器中自动创建的 Index 方法始终使用 Eager Loading,我一直有一个问题,为什么 Microsoft 在这种情况下使用 Eager Loading 默认值。
如果有人向我解释在什么情况下渴望加载比懒惰加载更有益,我将不胜感激,为什么我们使用它,而有更多的资源友好的懒惰加载?
我认为对这样的关系进行分类是很好的
何时使用热切加载
在一对多关系的“一侧”中,您确定与主要实体一起使用。如文章的用户属性。产品的类别属性。
一般当关系不是太多,急于加载将是很好的做法,以减少服务器上的进一步查询。
何时使用延迟加载
几乎在一对多关系的每一个“收集方”上。如用户文章或类别的产品
你完全知道你不会立即需要一个属性。
注意:像 Transcendent 说的那样,延迟加载可能存在处置问题。
Eager Loading:Eager Loading 可帮助您一次加载所有需要的实体。即,相关对象(子对象)随其父对象自动加载。
何时使用:
当关系不是太多时,请使用 Eager Loading。因此,Eager Loading 是减少服务器上进一步查询的良好做法。
当您确定将在各处使用与主实体相关的实体时,请使用 Eager Loading。
延迟加载:在延迟加载的情况下,相关对象(子对象)不会自动与其父对象一起加载,直到它们被请求。默认情况下,LINQ 支持延迟加载。
何时使用:
当您使用一对多集合时,请使用 Lazy Loading。
当您确定没有立即使用相关实体时,请使用“延迟加载”。
注意:实体框架支持三种方式加载相关数据-渴望加载,延迟加载和显式加载。
延迟加载将产生多个 SQL 调用,而 Eager 加载可能会通过一个“更重”的调用(使用连接 / 子查询)加载数据。
例如,如果您的 Web 和 sql 服务器之间有一个高 ping,您将使用 Eager 加载,而不是使用懒惰加载 1-by-1 加载相关项目。
考虑下面的情况
public cl 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)
强制加载。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(53条)