请告诉我如何实现RollbackusingEntityFramework 6.x以及工作单元模式。为此有一个接口类。IUnitOfWork
public interface IUnitOfWork : IDisposable
{
void Commit();
// void Rollback();
}
和类 -UnitOfWork
public class UnitOfWork : IUnitOfWork
{
public DbContext Context { get; private set; }
public UnitOfWork(DbContext context)
{
Context = context;
}
public void Commit()
{
if (Context != null)
{
Context.SaveChanges();
}
}
public void Dispose()
{
if (Context != null)
{
Context.Dispose();
}
}
}
我知道在 T-SQL 级别是这样设置的:
BEGIN TRANSACTION
// операции взаимодействия
IF (@@error <> 0)
ROLLBACK
COMMIT
更新程序
计划使用
try
{
repository.Delete(...);
unitOfWork.Commit();
}
catch
{
unitOfWork.Rollback();
// регистрация ошибки
}
只需调用 Dispose 而不调用 Commit。最后手动,或使用:
如果在调用 SaveChanges 之前发生错误,则更改将被包装器和上下文的 Dispose 简单地丢弃。
如果在SaveChanges执行过程中发生错误,那么SQL事务将被回滚,EF在SaveChanges开始时打开,并在保存所有更改后提交。
只是不要忘记,事实上 EF 中的上下文是工作单元 + 存储库模式的现成实现。你的 UnitOfWork 只是一个代理包装器,它本身并不实现 UoW——它只是将 UoW 接口与存储库分开。
因此,您拥有的上下文不应该比包装器存在的时间更长,因此您不能(也不应该)将它重新用于另一个 UnitOfWork 实例。
英语 StackOverflow 的用户提出了类似的问题:How to rollback a transaction in Entity Framework。经过实验,他发现如果调用 DbContext.SaveChanges 方法时发生错误,实体框架会自动回滚所有更改。