2009-07-01 19 views
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. 
    } 

これは自動的に行われます。つまり、エラーが発生した場合、すべての変更に対してコミットの変更がキャンセルされます。 ですか?Entity Frameworkでのトランザクションのロールバック方法

答えて

12

OK

は私がDBで確認質問とあとがきからの例のようなアプリケーションのサンプルを作成し、どのユーザーが追加されていません。

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

注:私は何をすることを「私は信じる」

+0

はいこれは正しいです –

8

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

} 
+0

などストアドプロシージャを実行する場合、トランザクションが必要であろうと考えていますか? – Shimmy

+0

本質的には、シンプルなシナリオではトランザクションのロールバックが無料であると考えています。さらに複雑なシナリオでは、2つの例のようにトランザクションを処理する必要があります。あなたのサンプルアプリがこれを確認しているようです。 申し訳ありませんが私の言葉が恒星よりも小さい場合 - 私はこれを昨日書いたときに中間の会議でした。 – FOR

関連する問題