ホームページ >バックエンド開発 >C++ >Transactionscope内でエンティティフレームワークを使用して4000のレコードをデータベースに挿入する最速の方法は何ですか?

Transactionscope内でエンティティフレームワークを使用して4000のレコードをデータベースに挿入する最速の方法は何ですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-02-02 06:11:14144ブラウズ

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

Entity Frameworkデータメソッドを効率的に挿入します

質問:

トランザクション処理にTransactionscopeを使用する場合、4,000を超えるレコードをデータベースにすばやく挿入する方法は?

回答:

大量のデータ挿入(4000レコード)の場合、メソッド効率は非常に低いです。次の最適化テクノロジーは、挿入速度を大幅に改善できます。

One -Time SaveChanges()

すべてのレコードがコンテキストに追加された後、使い捨ての呼び出し
  • batch SaveChanges()指定された数量(例えば、100項目)を処理した後、SaveChanges()を1回呼び出します。
  • 再構築コンテキスト:SaveChanges()バッチメソッドに似ていますが、コンテキストをリリースし、の後に追加のエンティティをリリースする新しいコンテキストを作成します。 SaveChanges()
  • テストの変更を無効にします:
  • 一時的に自動変更を無効にしてテストし、からSaveChanges()を設定します。 SaveChanges()
  • 実装例:
  • 次のコードフラグメントは、上記の最適化テクノロジーを組み合わせています。 Configuration.AutoDetectChangesEnabled このモードは、falseを呼び出す前に複数のレコードを処理することにより、バッチ挿入を実現します。さらに、コンテキストのリリースと再作成は、追加のエンティティを削除するのに役立ち、それによりメモリの使用が削減され、パフォーマンスが向上します。
パフォーマンスの比較:

この最適化モードを使用して、560,000エンティティをデータベースのパフォーマンステスト結果に挿入します。

:202秒

<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>

:164秒SaveChanges() SaveChanges() 対照的に、レコードごとに

に電話すると、同じ操作を完了するには何時間もかかります。

以上がTransactionscope内でエンティティフレームワークを使用して4000のレコードをデータベースに挿入する最速の方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。