1

ここに引用があります。「したがって、1つのオブジェクトコンテキストのみで作業している場合は、ObjectContext.SaveChangesメソッドを使用するときにデータベーストランザクションのサポートがすでに組み込まれています。」ここで見つけましたhttp://www.luisrocha.net/2011/08/managing-transactions-with-entity.html

TransactionScopeそれによると、以下のコードで使用する必要はありませんよね?

if (isLastCallSuccess)
 {
   if (condition1) //it's clear, no transaction needed
    {
      product.Property1 = true;
      context.SaveChanges();
    }

    else if (condition2)
     {
      using (TransactionScope scope = new TransactionScope()) //do I need it?
      {
        context.DeleteObject(item);             //deleting
        context.AddObject("product", new product      //adding
                                {
                                    Id = oldObject.Id,
                                    Property1 = true
                                });
        context.SaveChanges(System.Data.Objects.SaveOptions.DetectChangesBeforeSave);
                                scope.Complete();
        context.AcceptAllChanges();

        }
      }
4

5 に答える 5

0

同意しません; データに対して複数の操作があり、操作が完全に成功するか完全に失敗するか(アトミック)を確認する必要があるためです。また、アトミックであることを確認することもお勧めします。

削除は機能したが追加が失敗した場合、データベースは不良な状態のままになります。少なくともトランザクションがあった場合、最初の操作を試みる前にデータベースは元の状態に戻ります。

編集:

完了のために、トランザクション内で、同じメソッド/プロセスで複数のテーブルを操作し始める場合、いつでもトランザクションをロールバックできることが重要です。

于 2012-10-11T12:14:33.663 に答える
0

引用符が意味することは、への単一の呼び出しSaveChangesが自動的にトランザクションにラップされるため、アトミックであることです。ただし、複数回呼び出しSaveChangesているため、より大きな操作をアトミックにするには、現在のトランザクションを使用する必要があります。

はい、必要です。

于 2012-10-11T12:16:10.407 に答える
0

私が読んだ方法から、データベースにコミットしないで削除と追加を心配し、失敗した場合はトランザクションをロールバックすることを心配しています。上記のように、暗黙的にトランザクション管理を持つ 1 つの savechanges() ですべてが発生するため、トランザクションで挿入と削除をラップする必要はないと思います。そのため、失敗した場合、変更はロールバックされます。

于 2012-10-11T14:23:31.537 に答える
0

あなたのシナリオでは、トランザクションを使用する必要があると思います。SaveChangesいずれかのオブジェクトへの変更を永続化するときに、その変更を永続化できない場合に、行おうとした他のすべての変更をロールバックするような暗黙的なトランザクションを作成します。しかし、によって作成されたトランザクションはSaveChanges、呼び出し自体の間だけ存続します。2 回呼び出していて、2 回目の呼び出しが失敗した場合SaveChangesに最初の呼び出しのアクションをロールバックする場合は、両方の呼び出しをラップするトランザクションが必要です。投稿したコードはまさにそれを行います。

于 2012-10-11T12:19:11.827 に答える
0

私は個人的TransactionScopeに、すべてがユニット全体としてコミットされるか、エラーが発生するとロールバックされるように保持します(つまり、保存または追加が失敗します)。並行性がアプリケーションの主要な部分である場合、これを使用するとユーザーにメリットがあり、データの整合性が一貫しています。

于 2012-10-11T12:13:20.137 に答える