EF Core 延遲加載導致關係屬性為空
問題:
當獲取包含關聯數據的實體時,在執行顯式加載之前,EF Core 會初始返回空關係。
場景:
考慮以下實體類:
<code class="language-csharp">public class Mutant { public long Id { get; set; } public long OriginalCodeId { get; set; } public virtual OriginalCode OriginalCode { get; set; } } public class OriginalCode { public long Id { get; set; } public virtual List<Mutant> Mutants { get; set; } }</code>
關係在 OnModelCreating
方法中配置:
<code class="language-csharp">modelBuilder.Entity<Mutant>() .HasOne(m => m.OriginalCode) .WithMany(oc => oc.Mutants) .HasForeignKey(m => m.OriginalCodeId);</code>
問題:
最初,通過查詢檢索到的 Mutant 實體的 OriginalCode
屬性為 null。但是,在單獨的查詢中訪問 OriginalCodes
集合會填充 OriginalCode
屬性。
解釋:
EF Core 默認情況下不支持延遲加載。關係不會被急切加載,除非明確請求。在第一個場景中,由於 OriginalCode
關係沒有在查詢中顯式包含,因此它保持為 null。
解決方案:
有兩種方法可以解決此行為:
1. 急切加載:
使用 Include()
在查詢中顯式包含相關數據:
<code class="language-csharp">var mutants = db.Mutants.Include(m => m.OriginalCode).ToList();</code>
2. 使用延遲加載:
從 EF Core 2.1 開始,支持延遲加載。但是,這需要通過 UseLazyLoadingProxies()
啟用並使用虛擬導航屬性。
<code class="language-csharp">modelBuilder.UseLazyLoadingProxies(); public class Mutant { public long Id { get; set; } public long OriginalCodeId { get; set; } public virtual OriginalCode OriginalCode { get; set; } }</code>
阻止自動填充:
如果不需要自動填充關係,可以通過為每個查詢使用新的 DbContext 實例或使用 AsNoTracking()
進行無跟踪查詢來阻止它。
以上是為什麼 EF Core 關係在明確載入之前一直為空?的詳細內容。更多資訊請關注PHP中文網其他相關文章!