【发布时间】: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