【问题标题】:Revert DbContext.Savechanges in case a second DbContext.Savechanges fail恢复 DbContext.Savechanges 以防第二个 DbContext.Savechanges 失败
【发布时间】:2019-01-22 16:12:36
【问题描述】:

我有以下代码,用同一个方法将信息存储在两个不同的表中

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()出现异常恢复第一个怎么办?

【问题讨论】:

    标签: entity-framework


    【解决方案1】:

    一旦调用了SaveChanges,您的数据就会存储在您的数据库中。除非您愿意坚持中间步骤,否则您不应在通话中多次致电 SaveChanges

    您可以使用事务范围来创建托管事务:

    using (TransactionScope scope = CreateTransactionScope())
    {
        DoSomthing(context);
        scope.Complete();
    }
    

    但是,如果第二部分的失败涉及回滚第一部分,这意味着这两个部分属于同一个事务,因此简单地省略第一个 SaveChanges 会将您的代码变成一个事务。

    【讨论】:

      【解决方案2】:

      来自我的另一个awnser:您可以使用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();
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-12
        • 2021-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多