【问题标题】:Entity Framework Core navigation properties over-eagerly loadingEntity Framework Core 导航属性过度加载
【发布时间】:2017-01-01 01:02:03
【问题描述】:

我刚刚开始使用 EF 核心(使用 NPGSQL),并注意到在没有明确使用“包含”的情况下如何加载导航属性的一些奇怪行为。我看到的一个例子:

对象A

对象A->列出对象B |对象A->列出对象C

ObjectB->列出ObjectD

所有的导航属性都设置好了,数据库里有每种类型的item。

我在没有任何包含的情况下对 ObjectA 运行查询,因此导航属性应该为空。事实并非如此。根据查询的不同,有时其中一个会在没有明确包含的情况下被填写(不是两者,只是 ObjectB 或 ObjectC)。如果我做明确的包含,他们都会出现,就像预期的那样。这很烦人,但并不是我看到的真正糟糕的问题。

假设我查询一个 ObjectC。如果我设置了所有导航属性,它会按预期加载 ObjectA,但现在 ObjectA 也加载了它的所有导航属性;也不仅仅是与 ObjectC 相关的内容。 ObjectA 的所有孩子(和他们的孩子)也会回来。这会导致数百个与请求完全无关的项目返回。

这是代码优先的(我正在手动创建数据库,因为 NPGSQL 中的脚手架似乎非常有问题)。下面是如何为我的一个实体建模父关系的示例:

entity
  .HasOne<User>(c => c.User)
  .WithMany(p => p.Addresses)
  .HasForeignKey(c => c.UserId)
  .OnDelete(DeleteBehavior.Restrict)
  .HasConstraintName<User, Address>("fk_addresses_user");

如果我查询单个地址,则父用户将被拉回,但在此之下,与该用户相关的所有其他地址也将被拉回(这是一个单级关联,但如果地址有任何子级,它们都会被拉回以及)。

我现在很茫然;我唯一能做的就是从我的模型中删除所有子导航属性。

【问题讨论】:

  • 导航属性是否定义为virtual?
  • IIRC,Entity Framework 可以选择强制延迟加载(或禁用急切加载)
  • 您能否发布一些实际代码,以便我们了解您在做什么?请同时发布您的模型。另外,您能否为您遇到的任何脚手架错误打开问题?目前我还没有发现任何非常严重的事情。
  • @FrancisLord 您确实意识到延迟加载不在 RTM 构建中?请记住,这不是 EF 6,而是 EFC 1.0 docs.efproject.net/en/latest/querying/… 对于根本问题,我想说这种关系是问题的一部分,但没有模型代码的推测。
  • @mvermef 对不起,我不知道这个事实,我错误地认为 EF 6.0

标签: c# entity-framework-core npgsql


【解决方案1】:

我“认为”我知道它现在在做什么。它是自动的,包括已经在本地跟踪的其他属性(我猜这是有道理的)。我的测试我一次阅读/创建了几个项目,我对一些没有明确包含的东西填写感到困惑。经过更多测试后,当我有更简单的查询而不访问同一上下文中的其他实体时,它的行为符合我的预期

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    相关资源
    最近更新 更多