【问题标题】:Stop EF From Loading Entities When Assigning Association分配关联时停止 EF 加载实体
【发布时间】:2011-06-23 08:19:07
【问题描述】:

使用实体框架 v4 和 POCO 实体生成器 T4 模板。

我遇到的问题是,当我分配关联实体时,Fixup 方法正在加载数百个实体(请参阅下面的第 4 行)。

Dim context = New SomeEntities
Dim list = context.Lists.FirstOrDefault(Function(l) l.ListId = 2)
Dim queryDetail = context.CreateObject(Of QueryDetail)()
queryDetail.CriteriaColumnType = context.CriteriaColumnTypes.FirstOrDefault(Function(cct) cct.CriteriaColumnTypeId = 145)

正在分配的CriteriaColumnType 实体具有QueryDetail 对象的集合,并且在进行分配时,CriteriaColumnType 实体上的 FixUp 方法会延迟加载所有关联的 QueryDetails

如何创建 FK 关联并将 CriteriaColumnType 实体附加到我的 QueryDetail 实体而不加载所有 CriteriaColumnType's QueryDetail 记录?

【问题讨论】:

  • 澄清一下,您有一个 QueryDetail 和一个名为 CriteriaColumnType 的属性,其中包含其他 QueryDetails 的集合。

标签: entity-framework


【解决方案1】:

这里需要延迟加载吗?您可以将其关闭:

context.ContextOptions.LazyLoadingEnabled = false

【讨论】:

  • 我实际上考虑过使用它,但感觉就像是 hack。似乎很难相信临时的 Enitity Framework 用户真的希望在这种情况下加载关联实体的整个集合!
  • 我不认为这是 hacky。上下文是一个工作单元。并非所有 UOW 都需要延迟加载。它不必影响可能需要延迟加载的其他 UOW。
  • 我同意史蒂夫的观点。如果避免这种行为的唯一方法是关闭延迟加载,则应将其视为错误。此问题的唯一原因是更改跟踪(关联双方的修复导航属性)。代码在一侧为导航属性赋值。反过来,它希望将值分配给另一侧的导航集合,但由于访问集合,它会启动延迟加载。
  • @Ladislav:实际上,我同意它“感觉”像一个错误。我不是故意暗示其他的。但我的总体立场是延迟加载确实很容易被误用(如本例所示!),因此除非您明确需要,否则应将其关闭。
  • 没有双关语的意思,但除非需要,否则关闭延迟加载是......懒惰。这有点倒退。只有在需要整个对象图时,才应该急切地加载整个对象图。
【解决方案2】:

我也遇到了这个问题。过去需要几毫秒的操作开始需要 3-4 秒才能运行,这完全是因为我添加了一个指向大表的导航属性。

我通过从 T4 模板中删除所有修复代码解决了这个问题 - 我们的项目无论如何都不需要该功能。我删除了这一行的所有内容:

region.Begin("Association Fixup");

到下一个 region.End() 调用。我还从属性设置器、CollectionChanged 处理程序的注册和 _settingFK 标志中删除了对修复方法的所有调用。


有关为什么存在修复代码的更多信息,请参阅此问题:Why is "Fixup" needed for Persistence Ignorant POCO's in EF 4?。它试图确保如果您更改双向关联的一端,另一端也会更新。因此,例如,如果您创建一个新的 BlogPost 并将其 User 属性设置为用户,则修复逻辑会自动将帖子添加到用户的 Posts 集合中。

marc_s 通过链接到POCO Template Code Generation Options 回答了另一个问题。从 T4 模板中删除修复代码会将模板从 #2(带有修复的基本 POCO)更改为#1(没有修复的基本 POCO)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    相关资源
    最近更新 更多