【问题标题】:Entity Framework Core Lazy/Eager Loading实体框架核心延迟/急切加载
【发布时间】:2021-10-21 23:25:41
【问题描述】:

我有一个关于 EF Core 中的延迟加载和急切加载的问题。我研究了一下,发现默认情况下没有启用延迟加载,因为你必须确定你需要它。问题是我是否需要它。为此,我想举一个小例子:

    public class Model
    {
        [Key]
        public int ID { get; set; }
        public string Name { get; set; }
        public ICollection<Model> SubModel { get; set; }
        public ICollection<Property> Properties { get; set; }

    }

    public class Property
    {
        [Key]
        public int ID { get; set; }
        public string Name { get; set; }
        public string Type { get; set; }
        public Model ParentModel { get; set; }

    }

我基本上有这两个实体。例如,模型类有一个模型列表,因此是一种自引用关系。一个模型可以有一个模型列表,也可以有模型列表等等。关系的深度是用户定义的。所以从代码的角度来看,我无法判断这个“树”有多深。我尝试使用的是 Include 和 ThenInclude 但那是静态的方式。然后我尝试了这种延迟加载的方法,基本上解决了这个问题,但是很多人说你应该只在特定情况下使用延迟加载。在我不知道存在多少嵌套关系的情况下使用延迟加载会是这种情况吗?

【问题讨论】:

  • 您忘了告诉您要实现的目标,但从我读到的内容来看,延迟加载在这里非常好。您需要递归查询的一种或另一种方式。除非你总是一次得到整棵树。然后你就可以得到所有的Models,包括Properties,剩下的就是EF的关系修复。
  • 你是对的!这样做的目标是在可以在业务流程建模中使用的对象建模场景中使用它。用户可以定义模型,例如发票。例如,发票有一个 SubModel 客户,该客户具有属性,还可以具有嵌套模型,这些模型更详细地描述了客户的组件。目标是检索此模型的特定部分。例如,我只想要客户模型而不是发票模型和属性等。
  • 并不是说我喜欢延迟加载,但它可能在这里很有用。另一种方法是递归加载子模型。但这太基于意见了。

标签: asp.net-core entity-framework-core lazy-loading eager-loading


【解决方案1】:

使用LazyLoad时没有问题。当我们使用 IDE 生成实体时,我们每次都选择LazyLoad 选项。使用LazyLoad 选项,当您调用getters 时从数据库中获取数据。通过这个,它解决了很多问题,比如递归获取。在我们的系统中,我们有大约一千个表,所有实体关系都用FetchType.LAZY 注释。

还有我的建议,不要使用Collections 作为引用,使用本机查询通过maxResult 获取数据。因为如果您调用任何引用到您的数据的集合,许多框架会尝试获取所有关联的数据。

【讨论】:

  • "还有我的建议,不要使用集合作为引用,使用本机查询来获取具有 maxResult 的数据。因为如果你调用任何引用到你的数据的集合,很多框架都会尝试获取所有相关数据。”今天正好发生在我身上。例如,我做了类似的事情:_modelContext.Where(m =&gt; m.Name.Equals("pizza")) 它基本上返回了比萨饼,但它返回了包含比萨饼的对象列表以及所有其他子模型作为单独的列表成员。真的很奇怪
  • 是否使用 Newtonsoft.Json 延迟加载以获取您的数据作为 json 更改输出的格式?
  • 不要使用集合作为参考——这真的没有意义。 EF 的模型是针对应用程序的,而不是针对“其他框架”的。对于序列化程序,有很多方法可以防止导航属性的递归遍历。
  • 我的意思是,如果你有一个包含 5000 本书和 5000 位作者的书表,那么由于数据库查询的数量,这里的预加载肯定会更好。据我所知,延迟加载会执行更多查询以实现某些目标
  • 当您开始为collections 提取时,它正在使用批量操作进行提取(例如:在同一连接中每次提取 300 个)。它不是requering,只是继续使用fetchSize设置的新数据
猜你喜欢
  • 2011-03-14
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 2013-09-25
  • 1970-01-01
相关资源
最近更新 更多