代码检查:使用导航属性可能返回不完整的数据
此检查报告了在一组实体上执行查询(例如,使用 DbSet<T>.AsAsyncEnumerable() 方法)时,并且在查询中访问了相关实体但未急切加载或未在查询中显式包含的情况。
当发生这种情况时,相关实体可能不会加载到内存中,从而导致这些实体的数据不完整或丢失。 这可能会导致后续出现意外行为或错误。
为避免此问题,您可以使用 包含() 方法急切加载相关实体,或者启用延迟加载,以便在访问相关实体时按需加载它们。
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() 异步迭代 人员DbSet ,但未急切加载每个 Person 实体的 帐户 导航属性。
由于迭代是异步执行的,在嵌套 foreach 循环可以执行之前,上下文可能已被释放或修改,导致某些 Person 实体的 帐户 集合不完整甚至为空。
为解决此问题,我们使用 包含() 方法急切加载每个 Person 实体的 帐户 导航属性。
最后修改日期: 2025年 9月 26日