47

データベース優先のシナリオで DbContext を使用すると、エンティティの追加と削除が ObjectContext に比べて非常に遅いことがわかりました。2000 個のエンティティを追加して最後に変更を保存すると、DbContext は ObjectContext よりも 3 倍から 5 倍遅くなります (ちなみに、大量のエンティティを追加するには SqlBulkCopy を使用する方がよいことはわかっていますが、それは重要ではありません)。追加のたびに変更を保存する場合、DbContext は依然として約 2 倍遅くなります。削除に関してはさらに悪化します。すべてのエンティティの削除の最後に保存する場合、DbContext は ObjectContext よりも約 18 倍遅くなります。

データベース アクセス テクノロジを比較するために使用する高度に開発されたテスト アプリケーションと、小さなコンソール アプリケーションを使用して再確認しました。どちらも、DbContext を使用してエンティティを追加および削除すると、悪い結果を示しました。コンソール アプリケーションの結果は次のとおりです。

Inserting 2000 entities via DbContext saving changes at the end: 2164ms
Inserting 2000 entities via ObjectContext saving changes at the end: 457ms
Inserting 2000 entities via DbContext saving changes after each object addition: 8420ms
Inserting 2000 entities via ObjectContext saving changes after each object adding: 4857ms
Inserting 2000 entities via DbContext using a new DbContext for each object addition: 4018ms
Deleting 2000 entities via DbContext saving changes at the end: 4794ms
Deleting 2000 entities via ObjectContext saving changes at the end: 261ms
Deleting 2000 entities via DbContext saving changes after each object deletion: 25536ms
Deleting 2000 entities via ObjectContext saving changes after each object deletion: 2110ms

VC 2010 で EF 4.3 を、VS 11 で EF 5.0 Beta 2 を使用してみましたが、ほぼ同じ結果でした。「EF 4.x POCO Entity Generator for C#」、「EF 4.x DbContext Generator for C#」、「EF 5.x DbContext Generator for C#」で提供される T4 テンプレートを使用しました。

何が間違っている可能性がありますか?テスト結果によると、エンティティを追加または削除する必要があるアプリケーションで DbContext を使用することはありません (残念ながら DbContext を使用できない理由)。

コンソール テスト アプリケーションを Web サーバーに配置しました: EF 4.3 DbContext TestEF 5.0 DbContext Test

アイデア/修正は大歓迎です。

4

2 に答える 2

93

これを DbContext テストに追加してみてください。

dbContext.Configuration.AutoDetectChangesEnabled = false;

// Now do all your changes

dbContext.ChangeTracker.DetectChanges();
dbContext.SaveChanges();

もう一度テストを実行してみてください。

DbContext API にアーキテクチャ上の変更がありました。これは、毎回エンティティの変更をチェックするか、Addコンテキストから何かをチェックします。ObjectContext API では、この検出は、トリガーした場合にのみ実行されます。ほとんどの一般的なシナリオではより優れたソリューションですが、大量のデータ処理には特別な処理が必要です。AttachDeleteSaveChanges

于 2012-04-11T09:58:49.513 に答える
14

EF6 では、 DbSetでAddRangeRemoveRangeを使用できるようになりました。

リンクのドキュメントから:

AutoDetectChangesEnabled が true (デフォルト) に設定されている場合、エンティティを {adding,deleting} する前に DetectChanges が 1 回呼び出され、再度呼び出されることはないことに注意してください。これは、状況によっては、{Add,Remove}Range のパフォーマンスが、{Add,Remove} を複数回呼び出すよりも大幅に優れていることを意味します。

于 2014-10-31T09:10:01.410 に答える