代码检查:使用导航属性可能返回不完整的数据
此检查报告了在一组实体上执行查询(例如,使用 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日