如果第二个DbContext.Savechanges失败,请还原DbContext.Savechanges

时间:2019-01-22 16:12:36

标签: entity-framework

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

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()中有异常要还原第一个,该怎么办?

2 个答案:

答案 0 :(得分:0)

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

您可以使用交易范围来创建托管交易:

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

但是,如果第二部分的失败涉及回滚第一个部分,则意味着这两个部分都属于同一事务,因此,只需省略第一个SaveChanges即可将您的代码转换为单个事务。< / p>

答案 1 :(得分:0)

从我的另一个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();
        }
    }
}