どのようにロールバックトランザクション団体の枠組み
-
21-08-2019 - |
質問
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。
他のヒント
私は信じている(しかし、私はEFには、長い時間の専門家でありません)context.SaveChangesへの呼び出しが通過するまで、トランザクションが開始されていないこと。私はその呼び出しからの例外が自動的に開始されたトランザクションをロールバックう期待します。 代替(場合には、トランザクションの制御になりたい)から J.Lermanのは、「Entity Frameworkのプログラミング」>オライリー、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();
}
}
}
所属していません StackOverflow