EF Core的預先加載、延遲加載、實體追蹤
一、預先加載

【業務場景】
主表為 Bogs,里面包含了List<>類型的子表 Posts,Author。
【預先加載】
即在一次查詢時,一次性把所有的子表數據加載出來。
【關鍵字】
Include
二、延遲加載
注意:EF中默認是延遲加載,可以減少訪問數據庫次數。但是EF Core中默認不使用。如果需要使用,需要安裝擴展包:Microsoft.EntityFrameworkCore.Proxies

使用方式如下:

屬性的導航會有變化。

【延遲加載】
即按需加載。當我們需要時才會加載,比如例子中,我們查詢時,才會加載子表數據。
三、實體追蹤
EF每次執行查詢的時候,實際都會從數據庫拿到一個數據查詢的快照,這個實體快照包含了所有數據的實體狀態和實體跟蹤。直到SaveChange()執行的時候,我們才會去保存實體,數據庫才會真正的保存實體。

【對比】
默認情況下,跟蹤返回實體類型的查詢。 這表示可以更改這些實體實例,然后通過 SaveChanges() 持久化這些更改。 在以下示例中,將檢測到對博客分級所做的更改,并在 SaveChanges() 期間將這些更改永久保存到數據庫中。
在跟蹤查詢中返回結果時,EF Core 將檢查上下文中是否已存在實體。 如果 EF Core 找到現有的實體,則返回同樣的實例。 EF Core 不會用數據庫值覆蓋該實體中實體屬性的當前值和原始值。 如果未在上下文中找到該實體,EF Core 將創建新的實體實例,并將其附加到上下文。 查詢結果不會包含任何已添加到上下文但尚未保存到數據庫中的實體。
非實體跟蹤時,在只讀方案中使用結果時,非跟蹤查詢十分有用。 可以更快速地執行非跟蹤查詢,因為無需設置更改跟蹤信息。 如果不需要更新從數據庫中檢索到的實體,則應使用非跟蹤查詢。 可以將單個查詢替換為非跟蹤查詢。 非跟蹤查詢也會根據數據庫中的內容提供結果,但不考慮本地更改或已添加的實體。
var blogs = context.Blogs .AsNoTracking() .ToList();
還可以在上下文實例級別更改默認跟蹤行為:
context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; var blogs = context.Blogs.ToList();
EF Core 不會跟蹤結果中包含的無鍵實體實例。 但 EF Core 會根據上述規則跟蹤帶有鍵的實體類型的所有其他實例。
浙公網安備 33010602011771號