自動偵測變更

使用大部分 POCO 實體時,會由偵測變更演算法處理實體變更方式(因此需要傳送至資料庫哪些更新)。 偵測變更的運作方式是偵測實體目前屬性值與查詢或附加實體時儲存在快照集中的原始屬性值之間的差異。 本主題所示範的技巧同樣適用於使用 Code First 和 EF 設計工具所建立的模型。

根據預設,Entity Framework 會在呼叫下列方法時自動執行偵測變更:

  • DbSet.Find
  • DbSet.Local
  • DbSet.Add
  • DbSet.AddRange
  • DbSet.Remove
  • DbSet.RemoveRange
  • DbSet.Attach
  • DbContext.SaveChanges
  • DbCoNtext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries

停用變更的自動偵測

如果您正在追蹤內容中的許多實體,而且您在迴圈中多次呼叫其中一個方法,則您可能會在迴圈期間關閉變更的偵測,以取得顯著的效能改善。 例如:

using (var context = new BloggingContext())
{
    try
    {
        context.Configuration.AutoDetectChangesEnabled = false;

        // Make many calls in a loop
        foreach (var blog in aLotOfBlogs)
        {
            context.Blogs.Add(blog);
        }
    }
    finally
    {
        context.Configuration.AutoDetectChangesEnabled = true;
    }
}

別忘了在迴圈之後重新啟用變更偵測 — 我們已使用 try/finally 來確保即使迴圈中的程式碼擲回例外狀況,也一律會重新啟用它。

停用和重新啟用的替代方法是讓隨時關閉變更的自動偵測,以及呼叫內容。ChangeTracker.DetectChanges 明確或使用勤奮的變更追蹤 Proxy。 這兩個選項都是進階的,而且可以輕鬆地將微妙的錯誤引入您的應用程式,因此請小心使用它們。

如果您需要從內容新增或移除許多物件,請考慮使用 DbSet.AddRange 和 DbSet.RemoveRange。 這個方法只會在新增或移除作業完成之後自動偵測變更一次。