首頁 > 後端開發 > C++ > 在TransactionsCope中使用實體框架將4000記錄插入數據庫中的最快方法是什麼?

在TransactionsCope中使用實體框架將4000記錄插入數據庫中的最快方法是什麼?

Barbara Streisand
發布: 2025-02-02 06:11:14
原創
141 人瀏覽過

What's the Fastest Way to Insert 4000  Records into a Database Using Entity Framework within a TransactionScope?

Entity Framework 高效批量插入數據方法

問題:

在使用 TransactionScope 進行事務處理時,如何快速地將 4000 多條記錄批量插入到數據庫中?

答案:

對於大量數據插入 (4000 條記錄),逐條調用 SaveChanges() 方法效率極低。以下優化技術可以顯著提高插入速度:

  • 一次性 SaveChanges() 在所有記錄都添加到上下文後,一次性調用 SaveChanges()
  • 分批 SaveChanges() 處理指定數量的記錄後 (例如,100 條),調用一次 SaveChanges()
  • SaveChanges() 後重建上下文: 類似於分批方法,但在 SaveChanges() 後釋放上下文並創建一個新的上下文,以釋放已附加的實體。
  • 禁用更改檢測: 臨時禁用自動更改檢測,將 Configuration.AutoDetectChangesEnabled 設置為 false

實現示例:

以下代碼片段結合了上述優化技術:

<code class="language-csharp">using (TransactionScope scope = new TransactionScope())
{
    MyDbContext context = null;
    try
    {
        context = new MyDbContext();
        context.Configuration.AutoDetectChangesEnabled = false;

        int count = 0;
        foreach (var entityToInsert in someCollectionOfEntitiesToInsert)
        {
            ++count;
            context = AddToContext(context, entityToInsert, count, 100, true);
        }

        context.SaveChanges();
    }
    finally
    {
        if (context != null)
            context.Dispose();
    }

    scope.Complete();
}

private MyDbContext AddToContext(MyDbContext context,
    Entity entity, int count, int commitCount, bool recreateContext)
{
    context.Set<Entity>().Add(entity);

    if (count % commitCount == 0)
    {
        context.SaveChanges();
        if (recreateContext)
        {
            context.Dispose();
            context = new MyDbContext();
            context.Configuration.AutoDetectChangesEnabled = false;
        }
    }

    return context;
}</code>
登入後複製

此模式通過在調用 SaveChanges() 之前處理多條記錄來實現批量插入。此外,在 SaveChanges() 後釋放並重新創建上下文有助於清除已附加的實體,從而減少內存使用並提高性能。

性能對比:

使用此優化模式將 560,000 個實體插入數據庫的性能測試結果:

  • commitCount = 10000, recreateContext = false: 202 秒
  • commitCount = 100, recreateContext = true: 164 秒

相比之下,如果對每條記錄都調用 SaveChanges(),則完成相同操作將需要數小時。

以上是在TransactionsCope中使用實體框架將4000記錄插入數據庫中的最快方法是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板