엔티티 프레임 워크에서 거래를 롤백하는 방법
-
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.
}
또는이 작업은 자동으로 수행되므로 오류가 발생하면 모든 변경 사항에 대해 커밋 변경이 취소됩니다. 그게?
해결책
확인
DB에서 확인한 질문과 후반부의 예제와 같은 응용 프로그램을 샘플을 만들었으며 사용자가 추가되지 않았습니다.
결론 : ObjectContext.SeveChange는 자동으로 트랜잭션입니다.
메모: SPROC 등을 실행하는 경우 거래가 필요하다고 생각합니다.
다른 팁
나는 Context에 대한 호출이 진행될 때까지 거래가 시작되지 않았다고 믿는다. 나는 그 전화에서 예외가 시작된 거래를 자동으로 롤백 할 것으로 예상합니다. 대안 (거래를 통제하고 싶을 때) [ J.Lerman의 "프로그래밍 엔티티 프레임 워크" 오라일리, 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