>

동일한 방법으로 두 개의 서로 다른 테이블에 정보를 저장하는 다음 코드가 있습니다

public static async Task<Response> AddStockTransaction(StockTransactionsHeader header, List<StockTransactionsDetails> details)
{
    using (DataContext dbContext = new DataContext())
    {
        try
        {
            dbContext.StockTransactionsHeader.Add(header);
            await  dbContext.SaveChangesAsync();
            int hearderID = header.TransactionHeaderID;
            foreach (var item in details)
            {
                item.TransactionHeaderID = hearderID;
            }
            dbContext.StockTransactionsDetails.AddRange(details);
            await dbContext.SaveChangesAsync();
            return new Response
            {
                IsSuccess = true
            };                    
        }
        catch (Exception ex)
        {
            return new Response
            {
                IsSuccess = false,
                Message = ex.Message
            };
        }
    }
}

두 번째 SaveChanges ()에 첫 번째 것을 되돌릴 예외가있는 경우 어떻게해야합니까?

  • 답변 # 1

    한 번 SaveChanges  호출 된 경우 데이터가 데이터베이스에 저장됩니다. 당신은 SaveChanges 를 호출해서는 안됩니다  중간 단계를 기꺼이 유지하지 않는 한 통화 중 한 번 이상.

    트랜잭션 범위를 사용하여 관리 트랜잭션을 만들 수 있습니다 :

    using (TransactionScope scope = CreateTransactionScope())
    {
        DoSomthing(context);
        scope.Complete();
    }
    
    
    그러나 두 번째 파트의 실패가 첫 번째 파트를 롤백하는 경우 두 파트가 동일한 트랜잭션에 속하므로 단순히 첫 번째 SaveChanges 를 생략 함을 의미합니다.  코드를 단일 트랜잭션으로 전환합니다.

  • 답변 # 2

    다른 차일드에서 : DbTransaction 클래스를 사용할 수 있습니다.

    private void TestTransaction()
    {
        var context = new MyContext(connectionString);
        using (var transaction = context.Database.BeginTransaction())
        {
            try
            {
                // do your stuff
                // commit changes
                transaction.Commit();
            }
            catch
            {
                // 'undo' all changes
                transaction.Rollback();
            }
        }
    }
    
    

  • 이전 model binding - Laravel의 미들웨어에서 라우트 매개 변수 설정
  • 다음 typescript - Lodash at () 메소드가 TS 파일에서 작동하지 않습니다 (js에서 작동)