ReSharper 2025.2 Help

代码检查:使用导航属性可能返回不完整的数据

此检查报告了在一组实体上执行查询(例如,使用 DbSet<T>.AsAsyncEnumerable() 方法)时,在查询中访问相关实体但未急切加载或未在查询中显式包含的情况。

当发生这种情况时,相关实体可能不会加载到内存中,从而导致这些实体的数据不完整或丢失。 这可能会导致意外行为或后续错误。

为避免此问题,您可以使用 Include() 方法急切加载相关实体,或者启用延迟加载,以便在访问时按需加载相关实体。

await foreach (var person in ctx.People.AsAsyncEnumerable()) { // do something foreach (var account in person.Accounts) { result.Append(account.Login); } }
await foreach (var person in ctx.People.Include(person => person.Accounts).AsAsyncEnumerable()) { // do something foreach (var account in person.Accounts) { result.Append(account.Login); } }

在上述示例中,代码使用 AsAsyncEnumerable() 异步迭代 PeopleDbSet ,但未包括对每个 Person 实体的 Accounts 导航属性的任何急切加载。

由于迭代是异步执行的,在嵌套 foreach 循环可以执行之前,上下文可能已被释放或修改,导致某些 Person 实体的 Accounts 集合不完整甚至为空。

为解决此问题,我们使用 Include() 方法急切加载每个 Person 实体的 Accounts 导航属性。

最后修改日期: 2025年 9月 27日