EF核心工作模式下的交易

时间:2019-10-14 14:06:29

标签: c# transactions entity-framework-core

我在我的应用程序中将工作单元模式用于EF核心数据库优先方法。 我还以工作单元为单位实现了数据库事务。 例如。

public class UnitOfWork : IUnitOfWork
{
    private myDBContext _dBContext;
    public IDatabaseTransaction BeginTransaction()
    {
        return new EntityDatabaseTransaction(_dBContext);
    }
}

现在,我有用于不同操作的处理程序,每个处理程序都有工作单元的依赖项注入。在处理程序内部,我正在使用事务进行数据库操作。 例如。

public class Operation1Handler : BaseHandler
{
    IUnitOfWork _unitOfWork;
    public Operation1Handler(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    public override void Handle()
    {
        using(var _trans = _unitOfWork.BeginTransaction())
        {
            //some code
            _unitOfWork.Entity.SaveAsync();
            _trans.Commit();
        }
    }
}

现在,该处理程序正在像这样的WebAPI方法中被调用

public void MyAPI()
{
    var handler = new Operation1Handler();
    handler.Handle();
}

到目前为止,这一切都很好。 现在我的问题是我必须在WebAPI方法中调用2个不同的处理程序,这将执行不同的数据库操作。但是我希望两个处理程序下的所有操作都符合事务规范,即,如果处理程序2的操作失败,那么处理程序1的操作也应回滚。

public void MyAPI()
{
    var handler = new Operation1Handler();
    handler.Handle();

    var handler2 = new Operation2Handler();
    handler2.Handle();
}

任何人都可以帮助我实现这一目标。

1 个答案:

答案 0 :(得分:0)

我认为,在配置DI时,应将IUnitOfWork的生命周期确定为范围。使用AddScoped方法代替AddTransient

我同意@Rabban的评论。不要手动开始交易

相关问题