0

私のプログラムには、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オブジェクトをトランザクションに参加させる正しい方法は何ですか?

4

1 に答える 1

2

SABulkCopy私たちは授業をあきらめた。バルクロードを行わないことがわかりました。ステートメントSACommandを実行し、行を 1 つずつ挿入するオブジェクトを作成します。INSERTそして、起動するのは非効率的です。

SATransactionこれについて投稿しDBTransactioncontext.Connection.BeginTransaction(). 別の質問に応じて、これを行ういくつかのリフレクション コードが与えられました。

SATransaction saTransaction = (SATransaction) dbTransaction.GetType() 
                                                           .InvokeMember( "StoreTransaction", 
                                                                          BindingFlags.FlattenHierarchy | BindingFlags.NonPublic   | BindingFlags.InvokeMethod |
                                                                          BindingFlags.Instance         | BindingFlags.GetProperty | BindingFlags.NonPublic, 
                                                                          null, dbTransaction, new object[ 0 ] );

プログラムは必要なことを行います。ただし、Microsoft がクラスのStoreTransactionプロパティを公開していないのは残念です。EntityTransaction

于 2013-03-27T16:32:03.863 に答える