延迟加载与预先加载

时间:2015-07-12 09:21:06

标签: c# entity-framework entity-framework-6

实体框架中的延迟加载是加载和访问相关实体时发生的默认现象。然而,急切加载是指强制加载所有这些关系的做法。我遇到的问题是,在什么情况下,急切加载可能比延迟加载更有益。问这个,因为很明显延迟加载更加资源友好,即使我们使用ToList()方法,我们仍然可以利用延迟加载行为。但是,我认为可能延迟加载会增加对实际数据库的请求数量,这可能就是为什么有时开发人员使用Inlcude方法强制加载所有关系。例如,在MVC 5中使用Visual Studio自动搭建时,在控制器中自动创建的Index方法总是使用Eager Loading,而且我总是有一个问题,即在这种情况下Microsoft默认使用Eager Loading。

如果有人向我解释,在什么情况下,渴望加载比延迟加载更有益,我会很感激,为什么我们一直使用它,而有些资源更友好,如Lazy Loading。

8 个答案:

答案 0 :(得分:57)

我认为对这样的关系进行分类是好的

何时使用预先加载

  1. 在一对多关系的“一边”,你确定每个地方都与主要实体一起使用。喜欢文章的用户属性。产品的类别属性。
  2. 一般情况下,当关系不是太多时,急切的加载将是减少服务器上进一步查询的良好做法。
  3. 何时使用延迟加载

    1. 几乎在一对多关系的每个“收集方”。喜欢用户用品或类别产品
    2. 您确实知道您不会立即需要房产。
    3. 注意:就像Transcendent所说,延迟加载可能会出现处理问题。

答案 1 :(得分:15)

渴望加载: Eager Loading可帮助您一次加载所有需要的实体。即相关对象(子对象) 自动加载其父对象。

何时使用:

  1. 当关系不太多时使用Eager Loading。 因此,Eager Loading是减少服务器上进一步查询的一种很好的做法。
  2. 当您确定将在任何地方使用与主要实体相关的实体时,请使用“预先加载”。
  3. 延迟加载: 在延迟加载的情况下,不会自动加载相关对象(子对象) 使用其父对象,直到请求它们为止。 默认情况下,LINQ支持延迟加载。

    何时使用:

    1. 使用一对多集合时使用延迟加载。
    2. 如果您确定没有立即使用相关实体,请使用延迟加载。
    3.   

      注意: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;}

因此,在查询延迟加载时,加载所有参考对象要慢得多,但是渴望加载查询并仅选择相关的对象。