使用工作单元UnitOfWork实现事务

概述

工作单元模式有如下几个特性:1、使用同一上下文2、跟踪实体的状态3、保障事务一致性。工作单元用来维护一个由已经被业务事物修改的业务对象组成的列表。Unit  Of Work模式负责协调这些修改的持久化工作以及所有标记的并发问题。在数据访问层中采用Unit Of Work模式带来的好处是能够确保数据完整性。如果在持久化一系列业务对象(他们属于同一个事物)的过程中出现问题,那么应该将所有的修改回滚,以确保数据始终处于有效状态。.

主要代码实现

1、定义接口,实现构造函数

  public UnitOfWork(TDbContext context)
        {
            _dbContext = context ?? throw new ArgumentNullException(nameof(context));
            _repositories = new Dictionary<string, dynamic>();
        }


        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }


        public virtual void Dispose(bool disposing)
        {
            if (_disposed)
                return;


            if (disposing)
            {
                if (_dbContext != null)
                {
                    _dbContext.Dispose();
                    _dbContext = null;
                }
            }
            _disposed = true;
        }

2、定义SaveChanges和SaveChangesAsync保存方法

   public int SaveChanges()
        {
            return _dbContext.SaveChanges();
        }


        public Task<int> SaveChangesAsync()
        {
            return _dbContext.SaveChangesAsync();
        }

3、使用工作单元添加数据,最后提交_unitOfWork.SaveChanges()

   private readonly IUnitOfWork _unitOfWork;
   
     public void Add(ApplicationEntity app)
        {
           //todo
            _unitOfWork.SaveChanges();
        }

问题

这种方式其实是在最后的时候在一次性提交,因此对于自增长ID是无法提前知道的,所以如果事务内包含第二步依赖第一步的id的,建议可以使用其他类型的id来代替关联。