延迟加载与预先加载

Arr*_*rrr 63 c# entity-framework entity-framework-6

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

如果有人向我解释,在什么情况下,渴望加载比延迟加载更有益,我会很感激,为什么我们一直使用它,同时有更多的资源友好作为延迟加载.

far*_*ran 64

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

何时使用急切加载

  1. 在一对多关系的"一边",你肯定在主要实体的每个地方使用.喜欢文章的用户属性.产品的类别属性.
  2. 通常当关系不是太多而且急切加载将是减少服务器上的进一步查询的好习惯.

何时使用延迟加载

  1. 几乎在一对多关系的每个"收集方".喜欢用户的文章或类别的产品
  2. 您确切知道您不会立即需要房产.

注意:像Transcendent一样,延迟加载可能存在处理问题.

  • 我只想尝试回答同样的事情.当您知道很少需要使用相关数据时,请使用延迟加载.但是当你知道你会经常需要某些相关数据时,请使用预先加载. (5认同)

Dar*_*ter 19

渴望加载: 预先加载可帮助您一次加载所有需要的实体.即相关对象(子对象)与其父对象一起自动加载.

何时使用:

  1. 当关系不太多时使用Eager Loading.因此,Eager Loading是减少服务器上进一步查询的一种很好的做法.
  2. 当您确定将在任何地方使用主实体的相关实体时,请使用"预先加载".

延迟加载:延迟加载的情况下,相关对象(子对象)在其请求之前不会自动加载其父对象.默认情况下,LINQ支持延迟加载.

何时使用:

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

注意:实体框架支持三种加载相关数据的方法 - 急切加载,延迟加载和显式加载.

  • @rykamol:如果我要求您向我提供汤姆的个人数据,并且我提醒您,我可能需要他(某些)孩子的个人数据;您是否愿意立即获取汤姆及其所有孩子的所有数据(急切加载),或者您愿意给我汤姆的数据,然后向我保证,如果我最终要求的话,您将去获取他孩子的任何数据(延迟加载)?两种方法都有其优点,延迟加载可以避免加载未使用的数据,但急切加载可以最大限度地减少对数据库的访问。 (4认同)

ser*_*iyb 16

延迟加载将产生多个SQL调用,而Eager加载可能会加载一个"更重"调用(带有连接/子查询)的数据.

例如,如果您的Web和SQL服务器之间存在高ping,您将使用Eager加载而不是使用延迟加载逐个加载相关项.


Tra*_*ent 11

考虑以下情况

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在调用此方法后,您不能再延迟加载Employer实体了.为什么?因为db物体被处理掉了 所以你必须 Person.Include(x=> x.employer)强制加载它.

  • 是的,这是Lazy Loading无效的示例.另一件事是每次你需要一些数据时创建DbContext是不好的方法.如果您使用的是某个IoC容器,您的DbContext将与请求一起使用(如果是Web应用程序). (3认同)

Iqr*_*auf 6

延迟加载- 在处理分页时非常有用,例如页面加载用户列表中出现的内容包含 10 个用户,当用户向下滚动页面时,API 调用会带来接下来的 10 个用户。当您不想一次加载整个数据时,这很好,因为这会花费更多时间并且会带来糟糕的用户体验。

预加载- 正如其他人建议的那样,当关系不多并且在对数据库的单次调用中一次获取整个数据时,这是很好的选择

  • 连续滚动或分页!=延迟加载。 (2认同)

She*_*iff 5

急切加载 当您确定要一次获取多个实体时(例如,必须在同一页面上显示用户和用户详细信息),则应该进行急切加载。急切的加载使数据库命中一次,并加载了相关的实体。

延迟加载 当您只需要在页面上显示用户时,通过单击用户需要显示用户详细信息,则需要进行延迟加载。延迟加载会产生多次点击,以在绑定/迭代相关实体时加载相关实体。