gpt4 book ai didi

c# - 我无法用 Entity Framework 解释的行为

转载 作者:行者123 更新时间:2023-11-30 21:45:34 25 4
gpt4 key购买 nike

我试图在 Entity Framework 中查找有关行为的文档。它有效,但在依赖此行为之前,我想确保这是 EF 的正常行为,而不是将在未来版本中“修复”的意外副作用。这是情况:

我有一个非常深的对象层次结构(我将在这里简化)。该结构是一个多层次的对象集合(A 类包含 B 类的集合,B 类包含 C 类的集合,其中包含...)7 层深。

我必须根据 C 的某些属性过滤元素,我第一次尝试加载完整的层次结构时会产生一个复杂的 LINQ 查询(这将是一场维护噩梦)并且生成的 SQL 查询效率很低。为了简化这一切,我决定将查询分为两步:首先,我加载 C 类(及其所有子项)的集合,根据需要过滤,然后,我为包含的所有 B 实例加载 A 类和 B 类我筛选的 C 集合中的一项。

关键是:使用该技术,我预计必须手动重新填充 B 类中 C 的集合,但实际上,该集合已经填充了该集合的元素。我在 intellitrace 中验证了 SQL 查询,并且填充 C 实例所需的数据未包含在第二个查询中,因此唯一合乎逻辑的结论是 EF 根据上下文中的信息执行此操作。顺便说一句,该上下文已关闭延迟加载。

这种行为在 EF 中是否正常?是这样,你能给我链接到解释它是如何工作的文档吗?

这里有一个片段来说明这一点:

using(var context = new MyContext())
{
//Includes and where clauses are greatly simplified for the purpose of the sample
var filteredC = context.C.Include(x=>x.ListOfD).Include(x=>x.ListOfD.Select(y=>y.ListOfE)).Where(c=>c.Status==Status).ToList();

int[] bToLoad = filteredC.Select(c=>c.IDofB).Distinct().ToArray();

var listOfAAndB = context.A.Include(a=>a.ListOfB).Where(x=>x.ListOfB.Any(y=>bToLoad.Contains(y.ID))).ToList();

//At this step, I expected B.ListOfC to be empty but it's somehow populated
}

谢谢

最佳答案

这是 DbContext 生命周期的标准行为。老实说,我无法为您提供任何记录此功能的文档的链接,但我可以向您解释其工作原理。

EF 上下文是有状态的,并跟踪所有已获取的实体。它还知道数据库中的实体与实体模型之间的关系。

因此,如果您获取与该对象有直接关系的新对象(在您的情况下,C 具有指向 B 的外键),导航属性将由上下文填充。这是一个功能,而不是错误,因为它试图明确避免延迟加载查询到数据库以获取已获取的对象。

关于c# - 我无法用 Entity Framework 解释的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40024328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com