我目前正致力于实施aspnetboilerplate的交易管理
以下是我用来插入与订单相关的订单和产品的方法
public class OrderController
{
IOrderAppService _orderAppService;
public OrderController(IOrderAppService orderAppService)
{
_orderAppService = orderAppService;
}
public void TestOrder()
{
_orderAppService.TestTransaction();
}
}
public class OrderAppService : IOrderAppService
{
//repositories are injected here
public void TestTransaction()
{
//Created 'order' and 'products' here
//Committing the created objects
CommitOrderTransaction();
}
private void CommitOrderTransaction()
{
using (var unitOfWork = _unitOfWorkManager.Begin())
{
//Inserts the Order record
CommitInsertOrderHeader(); // Order Header is saved in database by using SaveChanges() method
//Inserts the Product records associated with OrderId
CommitInsertOrderDetails();
unitOfWork.Complete();
}
}
}
正如aspnetboilerplate文档所述, “如果当前的工作单元是事务性的,那么如果发生异常,事务中的所有更改都会回滚,甚至保存更改。”
在我插入OrderDetails时发生异常的情况下,我希望回滚头记录,但我仍然在数据库中有Order头记录。
答案 0 :(得分:1)
您无需手动处理交易。 ABP为您处理它!所有应用程序服务方法都自动设置为UnitOfWork。这是一个原子操作。因此,如果在事务中间发生任何异常,则所有数据库操作都将被回滚。
进一步信息请查看https://aspnetboilerplate.com/Pages/Documents/Unit-Of-Work
答案 1 :(得分:0)
如果您两次调用SaveChanges()而且两者都没有使用TransactionScope,那么您将无法回滚第一个调用。我不知道UnitOfWork在这里做了什么,但如果你正在使用的DbContext没有被用在那个UoW中,那么什么都不会发生。 DbContext在技术上已经是它自己的工作单元。您应该将订单和订单详细信息添加到同一个DbContext并仅调用一次SaveChanges()。然后,您就可以在这种情况下回滚。