簡體   English   中英

EF Core有條件地啟用延遲加載

[英]EF Core enable Lazy Loading conditionally

我正在尋找一種可能的方法來啟用我的DbContext延遲加載,但不是所有的時間,僅在我需要它的特定情況下。 由於N + 1查詢與大型數據集和JSON序列化遍歷對象屬性以及序列化整個數據庫等問題,我通常不希望延遲加載。 但是,在某些情況下,我確實想要它。 生成報告時,我加載頂級對象和許多子對象,以填充報告字段。 由於架構的性質,這將需要30個或更多Include()ThenInclude()調用而不進行延遲加載。

有沒有辦法在進行查詢時有條件地啟用延遲加載? 我嘗試使用2個DbContexts ,其中一個擴展另一個並啟用Lazy Loading,如下所示:

public class MyLazyContext : MyContext
{
    public MyLazyContext(DbContextOptions<MyLazyContext> options) : base(options) { }

    protected override OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseLazyLoadingProxies();
    }
}

並將它們作為依賴項單獨注入。 構造函數在將DbContextOptions<MyLazyContext>傳遞給需要DbContextOptions<MyContext>的基礎構造函數時遇到問題,因此我將它們都更改為DbContextOptions<MyContext> 雖然這在我的Web應用程序中有效,但由於我的泛型類激活器如何為DbContext工作,我的單元測試被打破了 - 這讓我覺得這種方法是代碼味道所以我開始尋找更好的解決方案。

您可以使用ChangeTracker.LazyLoadingEnabled屬性:

獲取或設置一個值,該值指示是否將在首次訪問時加載被跟蹤實體的導航屬性。

默認值是true。

例如

context.ChangeTracker.LazyLoadingEnabled = false;
var query = context.Set<…>()...;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM