Entity Frameworkデータメソッドを効率的に挿入します
トランザクション処理にTransactionscopeを使用する場合、4,000を超えるレコードをデータベースにすばやく挿入する方法は?
回答:
大量のデータ挿入(4000レコード)の場合、メソッド効率は非常に低いです。次の最適化テクノロジーは、挿入速度を大幅に改善できます。
One -Time SaveChanges()
:
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 サイトの他の関連記事を参照してください。