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

实体框架5的懒惰加载和Fiddler

冯星阑
2023-03-14

我在理解实体框架5中的延迟加载时遇到问题。我理解在使用延迟加载时,直到请求时才会加载相关实体:

使用延迟加载时,初始查询只引入目标实体集。但是,每当访问导航属性时,就会对存储发出另一个查询以加载相关实体。(引用)

我有一个包含两个类的ASP.NET Web API项目:

public class Farm
{
    public int FarmId { get; set; }
    public virtual ICollection<LandUnit> LandUnits { get; set; }
    ...
}
public class LandUnit
{
    public int LandUnitId { get; set; }
    ...
}

我将LazyLoadingEnabled设置为true,并使我的POCO类符合指南(参考),但当我使用scaffolding创建FarmController并通过fiddler调用它时,它显示:

JSON
    {}
        ...
    LandUnits
        {}
            ...

如果我设置LazyLoadingEn的=false,那么我得到:

JSON
    {}
        ...
    LandUnits=(null)

我是不是误解了懒惰加载的基本原理?在我看来,正在发生的事情与定义所说的相反。当延迟加载关闭时,相关实体将不加载。当开启延迟加载时,将加载相关实体。

共有2个答案

莫骞仕
2023-03-14

这只是表明你还没有请求任何LandUnits(如果你循环通过他们使用的东西,如Foreach,他们将被加载)。因此,当使用延迟加载时,JSON对象是空的。

禁用延迟加载时,LandUnits对象为空,因为LandUnits尚未加载,以后无法加载(尝试加载会引发错误)

司易安
2023-03-14

这是预期的行为。当JSON序列化程序对类型进行序列化时,它将枚举LandUnits导航属性,这当然会从数据库中调用该集合的延迟加载。

当您关闭延迟加载时,您的导航属性仍将设置为默认值,如图所示,因为实体框架不会生成任何代理类型。

我建议关闭延迟加载,并急切地(使用包含方法)或明确加载(使用加载方法)相关数据,以确保您不会无意中加载不需要的数据。

在使用默认JSON序列化程序时,您还应该注意循环依赖关系问题。

 类似资料:
  • 我有一个数据表的问题-懒加载。我认为问题是在IdiomasBean.java(TableBean.java),如果我把: 我得到了正确的数据表,但是<代码>按排序、筛选和不起作用。 我得到:java。lang.NullPointerException这里是堆栈跟踪: 下面是代码的其余部分: 指数xhtml diomasBean.java 懒散的数据模型。JAVA IdiomasBo.java 习语

  • 我在一个JavaSE项目中使用EclipseLink作为JPA提供者。我已经正确地配置了编织,以允许延迟加载。 与HiberNate(抛出LazyPresalizationExctive)不同,Eclipse Link可以获得LAZY关系的代理,即使是在封闭的实体管理器中。要运行此查询,它从池中获得一个新连接。 是否存在禁用或更改此功能行为的设置?在尝试访问未加载的属性(如Hibernate)时,

  • 我试图在primefaces数据表设置中实现延迟加载。目前,在没有延迟加载实现的情况下,这是可行的,但是在实现延迟加载后,我在datatable中没有得到任何数据。但是,我可以在我的LoadData方法中打印我的列表,以验证数据是否正在加载到我的列表中,但一旦返回我的LazyModel并尝试加载datatable,似乎就会出现问题。这可能只是我忽略的一些简单的事情。非常感谢您的帮助! 这是我的屏幕

  • 我已经阅读了本教程和这篇文章,但我不明白每种加载类型的确切用途。 我解释 我有这个POCO: 我明白这一点: > 对于懒惰加载:因为加载是懒惰的,如果我调用dbset将不会加载所有导航属性。这种类型的加载在性能和响应性方面是最好的。默认情况下启用它,如果我想重新启用它,我必须设置: 对于即时加载,它不是懒惰的:当我加载dpc\u-gestion时,它加载了所有导航属性。可以使用方法加载导航属性。要

  • 考虑以下(非常简化的)实体: 在我的映射器中,我可以设置用户罚款,但是一旦执行以下代码(在数据库中保留任何更改之前)

  • 我有一个问题,就是基于hasMany关系从数据库中获取数据并将其发送到Larave中的api。在下面的代码中,Laravel没有给我客户id=$id的产品。我不知道为什么,我不能在$query旁边发送$id。如果我把号码写在“我有很好的安全套,但我需要自动拿。 所有api代码 先谢谢你。