EF Core延迟加载导航属性
问题:
在Entity Framework Core (EF Core)模型中,导航属性在直接访问相关实体之前最初返回空值。
模型:
<code class="language-csharp">public class Mutant { ... public virtual OriginalCode OriginalCode { get; set; } } public class OriginalCode { ... public virtual ICollection<Mutant> Mutants { get; set; } }</code>
查询问题:
检索突变体时,OriginalCode导航属性为空:
<code class="language-csharp">var mutants = db.Mutants.ToList(); mutants.ForEach(m => Console.WriteLine(m.OriginalCode == null)); // 输出:所有突变体均为True</code>
关系的动态填充:
但是,当查询相关的OriginalCode实体时:
<code class="language-csharp">var originalCodes = db.OriginalCodes.ToList();</code>
突变体的OriginalCode导航属性会自动填充:
<code class="language-csharp">mutants.ForEach(m => Console.WriteLine(m.OriginalCode == null)); // 输出:所有突变体均为False</code>
解释:
EF Core的预加载机制会自动填充已加载到上下文中的相关实体的导航属性。在第二种情况下,当检索OriginalCodes时,相应的突变体也会加载到上下文中,因此它们的导航属性会被填充。
解决方案:
要控制此行为,应使用显式加载方法,例如预加载:
<code class="language-csharp">var mutants = db.Mutants.Include(m => m.OriginalCode).ToList();</code>
或者,要防止自动填充,请使用新的DbContext实例或无跟踪查询。
更新:
在EF Core v2.1中,现在支持延迟加载。要启用它,请将导航属性标记为virtual,安装Microsoft.EntityFrameworkCore.Proxies,并调用UseLazyLoadingProxies。
以上是为什么EF核心导航属性无效直到直接访问相关实体?的详细内容。更多信息请关注PHP中文网其他相关文章!