문제

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();
    }
  }

}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top