【问题标题】:Transactions in unit of work pattern for EF coreEF 核心工作单元模式中的事务
【发布时间】:2019-10-14 14:06:29
【问题描述】:

我在我的应用程序中使用 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();
}

谁能帮我实现这个目标。

【问题讨论】:

  • 不要手动开始事务,UnitOfWork 应该是它的包装器而不是工厂。为您的 Api 的每个请求创建一个新的 UnitOfWork -> UnitOfWork 开始事务 -> 做您的业务 -> 处理 UnitOfWork 并提交事务。此外,您的Operation1Handler 不应该知道事务处理,这是您应用程序基础架构的一部分。

标签: c# transactions entity-framework-core


【解决方案1】:

我认为在配置 DI 时,IUnitOfWork 生命周期应该是 Scoped 的。使用 AddScoped 方法而不是 AddTransient

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多