实体框架核心导航属性过度加载

时间:2016-08-24 18:52:47

标签: c# entity-framework-core npgsql

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

对象A

ObjectA->列出ObjectB | ObjectA-> List ObjectC

ObjectB-> List ObjectD

设置了所有导航属性,数据库中有每种类型的项目。

我在没有任何包含的ObjectA上运行查询,因此nav属性应为空。事实并非如此;根据查询,有时其中一个将填入而没有显式包含(不是两者,只是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");

如果我查询单个地址,则会撤回父用户,但在此之下,每个其他地址也与用户绑定(这是单级关联,但如果地址有任何子级,则会全部撤回同样)。

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

1 个答案:

答案 0 :(得分:0)

我认为&#39;我看到它现在正在做什么。它的自动包括已经在本地跟踪的其他属性(这是有意义的,我猜)。我的测试我一下子正在阅读/创建几个项目,并且在没有明确包含的情况下,我对一些正在填写的内容感到困惑。在进行了更多测试之后,当我有更简单的查询没有访问同一上下文中的其他实体时,它的行为正如我所期望的那样