私のプログラムには、Entity Framework 4 EDM を使用するプロセスがあります。エンティティ コンテキスト オブジェクトには、ストアド プロシージャを呼び出すための関数インポートが含まれています。
このプロセスは、リモート サーバーからデータのバッチを受信します。バッチは、任意のテーブル/データ型のデータで構成できます (各データ型は独自のテーブルに格納されます)。バッチには、同じ行のデータを複数回含めることもできます。これを 1 回の挿入 (最初の発生) および 1 回以上の更新 (後続の発生ごと) として処理する必要があります。したがって、ストアド プロシージャは、INSERT ... ON EXISTING UPDATE
コマンドを使用して upsert 操作を実装します。
このコードは基本的に、呼び出すストアド プロシージャを決定し、そのストアド プロシージャのエンティティ コンテキスト オブジェクトのメソッドを使用して呼び出します。次に、バッチ全体を 1 つのトランザクションで実行する必要があるためcontext.Connection.BeginTransaction()
、バッチの開始時に を呼び出します。
何百万行もあるデータ型が 1 つあります。そのデータをできるだけ早くロードする必要があります。SABulkCopy
クラスを使用してそのデータ型をインポートするロジックを実装しています。これも、すでに開始されている単一のトランザクションの一部である必要があります。SATransaction
問題は、クラスのコンストラクターに を渡す必要がありSABulkCopy
(プロパティを使用して設定する方法がない)、. がないことSATransaction
です。 context.Connection.BeginTransaction()
を返しますDBTransaction
。これを にキャストしようとしましたが、SATransaction
成功しませんでした。
SABulkCopy
オブジェクトをトランザクションに参加させる正しい方法は何ですか?