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;

留言

這個網誌中的熱門文章

ORA-12514: TNS: 監聽器目前不知道連線描述區中要求的服務

Oracle 例外控制(Exception Control)

Oracle 工作排程 DBMS_JOB 筆記