1

複数の更新ステートメントを更新する必要がありますが、すべてが自動性で機能する必要があります。つまり、すべてを更新するか、まったく更新しないでください。

インターネットやその他のSOの質問で、トランザクションの使用方法を見つけましたが、1つのトランザクションで複数のステートメントを更新するように言っているものは見つかりませんでした。以下の3つの更新ステートメントを参照してください。現在、トランザクションで実行されていません。

/// this are my update calls.
var report = reportRepository.Update(reportModel);
var book = bookRepository.Update(bookModel);
var mobile = mobileRepository.Update(mobileModel);

// each Update method for all repository will looks like
public returnModel Update(someModel model)
{
    // assign values from model to entity
    Context.ObjectStateManager.ChangeObjectState(entity,System.Data.EntityState.Modified)
    Context.SaveChanges();
}
4

3 に答える 3

4

更新をTransactionScopeでラップできます。

using (TransactionScope transaction = new TransactionScope())
{
    var report = reportRepository.Update(reportModel);
    var book = bookRepository.Update(bookModel);
    var mobile = mobileRepository.Update(mobileModel);
    ...
    transaction.Complete();
}
于 2012-07-02T07:27:00.217 に答える
1

ダリンが述べたように、トランザクションスコープを使用するか、私の好みの方法は、リポジトリをIUnitOfWorkインターフェイスに所属させることです。updateを呼び出すと、状態が変更済みに設定されるだけで、リポジトリの外部でSaveChangesが実行され、すべての変更が一度に保存されます。これは、1つのトランザクション内で自動的に発生するはずです。

したがって、すべてのUpdatesを呼び出してから、unitOfWork.SaveChangesを呼び出します。ここで、カスタム作業単位クラスにはコンテキストへの参照が含まれ、Save()と呼ばれるIUnitOfWorkで定義されたメソッドを実装します。

于 2012-07-02T07:32:08.423 に答える
0

基本的に、TransactionScopeクラスを介して管理する必要があります。これを使用して、モデルに複数の更新を設定し、Transaction.Completeを使用して1つのトランザクションにデータを保存できます。

詳細については、エンティティフレームワークでの単一トランザクションでの複数のオブジェクトの更新を確認してください。

于 2012-07-02T07:29:56.150 に答える