我有以下代码,以相同的方法将信息存储在两个不同的表中
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()中有异常要还原第一个,该怎么办?
答案 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();
}
}
}