首页 > 后端开发 > C++ > 为什么EF核心导航属性无效直到直接访问相关实体?

为什么EF核心导航属性无效直到直接访问相关实体?

Mary-Kate Olsen
发布: 2025-01-24 22:16:10
原创
608 人浏览过

Why Are EF Core Navigation Properties Null Until Direct Access to Related Entities?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板