C#, Entity Framework 執行速度優化
C#, Entity Framework, EF, 執行速度優化
.AsNoTracking() --> 資料不追蹤, 查詢結果不能直接執行SaveChanges()
以下是有關.AsNoTracking()的詳細說明:
跟蹤(Tracking):當你使用EF檢索數據時,EF默認會將檢索到的實體對象添加到內部上下文(DbContext)的跟蹤(或追蹤)中。這意味著EF將跟蹤這些對象的更改,並在適當的時候自動更新數據庫。
.AsNoTracking()的作用:當你調用.AsNoTracking()方法時,EF將停止跟蹤查詢返回的實體對象。這意味著即使你對這些對象進行了更改,EF也不會自動更新數據庫。這可以提高性能,特別是在只需要讀取數據而不需要進行更新操作的情況下。
性能優化:當你使用.AsNoTracking()時,EF不會生成額外的SQL語句來檢查實體對象的更改狀態 ,這可以減少數據庫交互的次數,從而提高性能。此外,不需要將實體對象添加到上下文的跟蹤中,也可以減少內存使用。
使用場景:.AsNoTracking()通常在以下情況下很有用:
- 當你只需要從數據庫中檢索數據,而不打算對其進行更新。
- 當你執行只讀操作,如報告生成或查詢操作。
- 當你處理大量數據,並且不需要EF自動追蹤所有這些對象的更改。
查詢結果不能直接執行SaveChanges()
- 可以透過把Entity.State變更為Modify後, 再SaveChange()。
var query = from data in dbContext.EntityABC.AsNoTracking() select data;
將Entity Framework的自動更改偵測功能關閉
DbContext.Configuration.AutoDetectChangesEnabled = false;
將Entity Framework的自動更改偵測功能關閉。當你對DbContext進行多個操作(如添加、更新、刪除實體)時,Entity Framework通常會自動檢測更改,並將其跟蹤在內部,以便在保存更改時進行適當的處理。將此設置為false會禁用自動更改偵測,這將在某些情況下提高性能,特別是當你處理大量數據時,因為它不再需要跟蹤每個更改。
在資料Add到上下文這個階段比較耗時。出現這個問題的原因是:每次調用ctx.Orders.Add(order)之前,EF都會調用DetectChanges
DbContext.Configuration.AutoDetectChangesEnabled 是 Entity Framework 中的一個設置,用於控制是否自動檢測對實體對象的更改。當設置為 false 時,EF 將停止自動檢測更改,這可以在某些情況下提高性能,特別是在處理大量實體對象時。
自動檢測更改:當你對從數據庫中檢索的實體對象進行更改時,Entity Framework 默認會自動檢測這些更改,並將它們跟蹤到內部的上下文 (DbContext) 中。這允許 EF 在適當的時候自動生成 SQL 語句並將更改保存到數據庫。
性能考慮:自動檢測更改是一個方便的功能,但在某些情況下,它可能導致性能下降。特別是當你處理大量實體對象時,每次更改都會觸發內部跟蹤機制,這可能會導致性能瓶頸。在這種情況下,關閉自動檢測更改可以提高性能。
手動更改檢測:當你將 DbContext.Configuration.AutoDetectChangesEnabled 設置為 false 時,EF 將不再自動檢測更改,這意味著你需要手動調用 DbContext.ChangeTracker.DetectChanges() 來觸發更改檢測。這樣做可以讓你在更方便的時候手動觸發更改檢測,而不是在每次更改時都觸發。
使用場景:關閉自動檢測更改通常在以下情況下很有用:
- 當你處理大量實體對象,並且只需要在特定時間點手動觸發更改檢測。
- 當你進行大批量數據操作,例如大量的數據插入或更新,並且不需要 EF在每次操作之後自動檢測更改。
變更實體不再由DbContext跟蹤
代碼將特定實體(ABC)的狀態設置為"Detached",這表示該實體不再由DbContext跟蹤。當一個實體處於"Detached"狀態時,它不會參與上下文的變更追蹤,並且不會在保存更改時被包括在內。這通常用於將一個對象從上下文中分離出來,例如當你想要停止跟蹤某個對象,而不希望它參與接下來的操作。
DbContext.Entry(ABC).State = System.Data.Entity.EntityState.Detached;
留言
張貼留言