当前位置: 首页 > 知识库问答 >
问题:

实体框架延迟加载启用的含义

子车芷阳
2023-03-14

我从这个网站上读到了关于懒惰加载的内容。启用或禁用LazyLoding

“如果我们请求已启用LazyLoading的学生列表,数据提供程序将从数据库中获取所有学生,但每个StudentAddress属性在显式访问该属性之前不会加载。”

此语句表示,当我将延迟加载启用=true设置为true时,将不会加载相关数据。然而

List<Students> stdList = Datacontext.Students.ToList();

如果我设置延迟加载启用=true,上面的代码返回所有特技与他们的老师和地址。我在这里错过了什么?有人能解释一下吗?

共有2个答案

蒲勇
2023-03-14

您是如何注意到使用调试器加载了属性的?如果是这样,那么你已经有了答案。通过调试器,您也可以访问该属性,因此,这也会触发延迟加载。

这是如何工作的?

如果您的实体满足这些要求,那么EF将为您的每个实体创建一个支持更改跟踪或延迟加载的代理类。这样,只有在访问相关实体时才能加载这些实体。正如我前面解释的,调试器也会触发延迟加载。

现在,在延迟加载时要小心,一旦上下文被释放,当您试图访问一个相关属性时,就会出现异常。因此,我建议在这种情况下使用即时加载。

别锐
2023-03-14

无论您有什么设置,如果您使用。ToList()它将枚举可枚举的。这是非常重要的,这个短语应该成为你的常识。

当使用.ToList()时,会发生很多事情。枚举可枚举项意味着前面的一组如何枚举集合的集合现在被用于实际迭代集合并填充数据。这意味着之前的枚举数(在内部存储为表达式树)现在将从实体框架发送到SQLProvider工厂。然后将对象图从表达式树转换为SQL,并在服务器上执行查询,从而返回数据并填充列表。

懒惰加载,而不是使用ToList(),如果您有这个IQueryable可枚举,然后迭代手动加载集合中的每个元素,或者只加载集合中的部分元素。

一旦返回了元素列表,只有当有导航属性时,才会进行延迟加载。如果存在相关属性,例如,如果您有发票,并且希望从客户表中获取相关的客户信息。关系一开始不会显式返回,只返回发票。因此,为了获取客户数据,您可以通过(当上下文仍然打开时,即未处理)访问这些数据。对象上的客户引用,它将加载。相反,要在原始枚举期间加载所有客户,可以使用。在可查询文件上包含()功能,这将告诉sql提供程序工厂在发出查询时使用连接。

在你的具体例子中,

List<Students> stdList = Datacontext.Students.ToList();

这实际上不会加载所有的教师和地址,不管是否启用了延迟加载。它只会加载学生。如果您想延迟加载一个教师,而Datacontext仍然没有被释放,那么您可以使用

var firstStudent = stdList.First();
var teacher = firstStudent.Teacher; 
//and at this point lazy loading will fetch the teacher 
//by issuing **another** query (round trip) to the database

只有启用了延迟加载,这才有可能。

另一种方法是快速加载,其中包括教师和地址。看起来像这样

List<Students> stdList = Datacontext.Students
    .Include( s => s.Teacher )
    .Include( s => s.Address ).ToList();

随后,如果您试图访问教师,则可以释放上下文,并且仍然可以访问,因为数据已经加载。

var firstStudent = stdList.First();
var teacher = firstStudent.Teacher; 
//and at this point the teacher was already 
//loaded and as a result no additional round trip is required
 类似资料:
  • 考虑以下(非常简化的)实体: 在我的映射器中,我可以设置用户罚款,但是一旦执行以下代码(在数据库中保留任何更改之前)

  • 我正在使用启用延迟加载的实体框架5。我有以下代码: 但这有意义吗?我想确保公共属性订阅从不为null。由于虚拟实体框架覆盖了getter和setter以提供延迟加载功能。 我需要这个字段还是我可以只使用一个自动属性,如果没有订阅,我得到一个空列表?

  • 我已经将读上下文和写上下文分开了,现在我将在默认情况下在ReadOnlyContext中启用LazyLoading。我也使用了下面的方法,但不幸的是它不起作用。 我的模型: 我的ef版本: EntityFramework核心版本2.1.2 我得到了这个错误: “为警告‘Microsoft.EntityFrameworkCore.Infrastructure.DetachedLazyLoadingW

  • 当将实体模型转换为DTO时,我对Entity Framework Core(v2.0.1)有一个问题。基本上,通过该短语的任何其他版本,当我不想加载时,它是延迟加载的。这是一个简单的。NET Core Console应用程序(带有Microsoft. EntityFrameworkCore. SqlServer(2.0.1)包)。 现在,当执行方法来检索数据时,它正在执行以下SQL 如您所见,它没

  • 我正在使用Play Framework v.2.6.3和用于SQL访问的JPA解决方案。 当我在实体上设置FetchType.Lazy时,我会收到以下错误消息: play.api.http。HttpErrorHandlerExceptions$$anon$1:执行异常[[RuntimeException:java.lang.IllegalArgumentException:未能延迟初始化角色集合:

  • 我定义了两个具有一对多外键关系的类,它们首先由数据库生成。 我创建了一个代理对象,并将其添加到DBContext中。 然后我设置了一个外键属性并尝试访问相应的导航属性。 设置外键属性标签\u id不会加载导航属性标签。代码中的最后一行返回。 这些类遵循此处列出的创建POCO代理的要求(调试显示已创建代理car对象,因此我相信所有要求都已满足)。 数据库表标签包含主键为4的项。 我不是在这里调用或,