Entity Frameworkでトランザクションをロールバックする方法

c# entity-framework rollback savechanges transactions

質問

string[] usersToAdd = new string[] { "asd", "asdert", "gasdff6" };
using (Entities context = new Entities())
{
    foreach (string user in usersToAdd)
    {
        context.AddToUsers(new User { Name = user });
    }
    try
    {
        context.SaveChanges(); //Exception thrown: user 'gasdff6' already exist.
    }
    catch (Exception e)
    {
        //Roll back all changes including the two previous users.
    }

あるいは、これは自動的に行われます。つまり、エラーが発生した場合、コミットした変更はすべての変更に対して取り消されます。それは...ですか?

受け入れられた回答

OK

私は、DBでチェックインした後の質問とサンプルからサンプルのようなアプリケーションを作成しましたが、ユーザーは追加されませんでした。

結論:ObjectContext.SaveChangeは自動的にトランザクションです。

注: sprocsなどを実行する場合は取引が必要になると思います。


人気のある回答

私は、context.SaveChangesへの呼び出しが行われるまでトランザクションは開始されないと信じています(しかし私はEFの専門家ではありません)。その呼び出しからのExceptionが、それが開始したトランザクションを自動的にロールバックすることを期待しています。代替案(トランザクションを管理したい場合)[ J.Lermanの "Programming Entity Framework"から O'Reilly、pg。 618]

using (var transaction = new System.Transactions.TransactionScope())
{
  try
  {
    context.SaveChanges();
    transaction.Complete();
    context.AcceptAllChanges();
  }
  catch(OptimisticConcurrencyException e)
  {
    //Handle the exception
    context.SaveChanges();
  }
}

または

bool saved = false;
using (var transaction = new System.Transactions.TransactionScope())
{
  try
  {
    context.SaveChanges();
    saved = true;
  }
  catch(OptimisticConcurrencyException e)
  {
    //Handle the exception
    context.SaveChanges();
  }
  finally
  {
    if(saved)
    {
      transaction.Complete();
      context.AcceptAllChanges();
    }
  }

}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ