15

私の現在のプロジェクトでは、外部システムとの毎日の同期が必要です。同期は、広範なビジネス ロジックで解析および処理される複雑なインポート ファイル構造に基づいています。ビジネス ロジックのため、ストアド プロシージャや統合サービスで同じロジックを記述する代わりに、これを .NET コードで作成し、既存の BL コンポーネントを再利用することにしました。

BL レイヤーは、EF 4.0 データ アクセス レイヤーの上にあります。現在の実装プロセスでは、インポート バッチが処理され、すべての変更が ObjectContext に入力され、トランザクションで SaveChanges が実行されます。SQLプロファイラーを確認すると、EFが各エンティティの変更を単一のSQLコマンドとして実行することがわかります(DBへの独自のラウンドトリップを使用)。さらに、これらのコマンドは完全に順番に実行されているようです。したがって、最初のインポートではデータベースへの最大 100.000 ラウンドトリップがあり、毎日の同期ではデータベースへの 10.000 ~ 50.000 ラウンドトリップがあります。

EF自体またはプロバイダー/拡張機能によって、何らかの方法で挿入/更新/削除コマンドをバッチ処理することは可能ですか?

4

5 に答える 5

9

いいえ、できません(はい、私も泣きます)。

EF はバッチ操作をサポートしていません。LINQ-SQL には同じ問題がありました。

いくつかのオプションがあります:

  1. ストアド プロシージャ
  2. 従来の ADO.NET または EntitySQL
  3. トリガー

過去にオプション1と3を使用しました。

3 つのアプローチすべての問題は、EF の抽象化、内部グラフ (オプティミスティック コンカレンシー) が失われ、ネイティブ SQL の世界に引き戻されることです。

于 2010-12-10T09:50:07.887 に答える
3

このプロジェクトに注意してください:magiq.codeplex.com

これにより、linq-to-sql にバッチ操作がもたらされ、現在は EntityFramework のサポートに取り組んでいます。

乾杯

于 2011-04-29T15:50:48.797 に答える
3

SQL Server にはいくつかの回避策があります。

Oracle、MySQL、POstgreSQL、または SQLite に関心がある場合は、最新の Devart dotConnect プロバイダーを使用できます。BatchUpdates機能は、これらのプロバイダーの最新バージョンの SaveChanges メソッドに既に統合されています。

于 2011-05-20T12:13:02.147 に答える
0

これは、コードの最初の POCO を高速に使用できるようにする方法です。一括挿入が 1 時間以上から最大 5 秒に高速化されました。

Generic List の SqlBulkCopy (Entity Framework および NHibernate に役立ちます)

于 2012-03-31T23:35:29.950 に答える