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中文網其他相關文章!