UnitofWork [aspnetboilerplate]交易管理

时间:2017-12-04 12:34:47

标签: entity-framework transactions entity-framework-6 aspnetboilerplate

我目前正致力于实施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头记录。

2 个答案:

答案 0 :(得分:1)

您无需手动处理交易。 ABP为您处理它!所有应用程序服务方法都自动设置为UnitOfWork。这是一个原子操作。因此,如果在事务中间发生任何异常,则所有数据库操作都将被回滚。

进一步信息请查看https://aspnetboilerplate.com/Pages/Documents/Unit-Of-Work

答案 1 :(得分:0)

如果您两次调用SaveChanges()而且两者都没有使用TransactionScope,那么您将无法回滚第一个调用。我不知道UnitOfWork在这里做了什么,但如果你正在使用的DbContext没有被用在那个UoW中,那么什么都不会发生。 DbContext在技术上已经是它自己的工作单元。您应该将订单和订单详细信息添加到同一个DbContext并仅调用一次SaveChanges()。然后,您就可以在这种情况下回滚。