首頁 >後端開發 >C++ >為什麼 EF Core 導航屬性在直接存取相關實體之前為空?

為什麼 EF Core 導航屬性在直接存取相關實體之前為空?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-24 22:16:10617瀏覽

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 Core 導航屬性在直接存取相關實體之前為空?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn