9
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.
    }

または、これは自動的に行われる可能性があります。つまり、エラーが発生した場合、変更のコミットはすべての変更に対してキャンセルされます。それは...ですか?

4

2 に答える 2

12

わかった

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

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

注: sprocなどを実行する場合はトランザクションが必要になると思います。

于 2009-07-01T17:40:56.183 に答える
8

私は、context.SaveChangesの呼び出しが完了するまで、トランザクションは開始されないと信じています(ただし、私はEFの専門家ではありません)。その呼び出しからの例外は、開始したトランザクションを自動的にロールバックすると思います。代替案(トランザクションを管理したい場合)[ J.Lermanの「ProgrammingEntityFramework」 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();
    }
  }

}
于 2009-07-01T16:34:47.390 に答える