簡體   English   中英

將導航屬性聲明為延遲加載,但急於加載它。 不好的做法?

[英]Declaring navigation property as lazy loading but eager loading it. Bad practice?

我們所有的導航屬性都定義為虛擬(延遲加載),但是大多數都渴望加載(.include),因此延遲加載的靈活性是否對性能產生了影響? 我們是否應該僅在真正需要進行延遲加載時才進行延遲加載?

謝謝。

快速基准測試(在對象圖中加載數千個對象)表明,啟用或禁用延遲加載和代理生成時,加載時間沒有明顯差異。

但是,當您知道確實渴望加載(並可能使用短時上下文)時,我總是會關閉延遲加載和代理生成。

context.Configuration.LazyLoadingEnabled = false;
context.Configuration.ProxyCreationEnabled = false;

即使它不能顯着提高性能,但至少它消除了上下文超出范圍時觸發惰性加載的風險,或消除了對象序列化時惰性加載級聯的風險。

在您的情況下,當優先加載時,您甚至可以將其設置為默認值,即在構造函數中將這些屬性轉換為上下文類。

請注意,使用AsNoTracking()獲取對象時確實會獲得性能,這是在獲取用於只讀目的的對象時的一種很好的做法。 這種情況經常發生:在斷開連接的設置中,例如當對象序列化到Web客戶端時,即使客戶端可能能夠修改對象,上載也始終是只讀的。 更改將在后期操作中處理。

這取決於您為什么要處理返回的對象。 當您嘗試訪問導航屬性時,延遲加載將導致新查詢被發送到數據庫。

如果您希望加載該對象以包含其所有導航屬性,然后再從不使用它們,則可以。 您正在從數據庫請求更多數據,然后必須花費更多時間來解析它們。 當然,反之亦然。

如果從數據庫中獲取一個對象並開始訪問導航屬性,則必須在數據庫中查詢它們,從而導致出現n + 1個查詢。 我要說的是,這比批量查詢記錄要昂貴得多,但實際上取決於您知道如何將對象用於特定操作。

就個人而言,在Web環境中,我渴望加載,因為上下文是短暫的。 在桌面環境中,您可以使整個應用程序會話的上下文保持活動狀態,我將使用延遲加載,因為您不必一遍又一遍地為后續查詢構建上下文。

暫無
暫無

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

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