首頁 > 後端開發 > C++ > 為什麼 EF Core 關係在明確載入之前一直為空?

為什麼 EF Core 關係在明確載入之前一直為空?

Patricia Arquette
發布: 2025-01-24 22:19:08
原創
562 人瀏覽過

Why are EF Core Relationships Null Until Explicitly Loaded?

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板