代码之家  ›  专栏  ›  技术社区  ›  Ahsan

如何在MVC5中使用EF中的开始事务

  •  0
  • Ahsan  · 技术社区  · 3 年前

    我已经阅读了Ardalis先生的Clean Architecture文档和eShopOnWeb,并在我的项目ASP.NET MVC5中实现了它们。 此外,我还实施了IUnitOfWork。

    我的项目有三层

    1. ApplicationCore
    2. 基础设施
    3. UI

    在里面 ApplicationCore 我有一个存储库界面:

    public interface IRepository<TEntity> where TEntity : class
    {
        List<TEntity> GetAll(ISpecification<TEntity> specification = null);
        TEntity GetById(int id);
        void Add(TEntity entity);
        void AddRange(IEnumerable<TEntity> entities);
        void Update(TEntity entity);
        void Delete(TEntity entity);
    }
    

    IUnitOfWork 接口:

    public interface IUnitOfWork
    {
        void BeginTransaction();
        IRepository<TEntity> GetRepository<TEntity>() where TEntity : class;
        void Commit();
        void TransactionCommit();
        void Rollback();
    }
    

    Infrastructure 层,我有这些接口的实现:

    public class EfRepository<TEntity> : IRepository<TEntity> where TEntity : class
    {
        private readonly OrderExchangeEntities _context;
        private readonly DbSet<TEntity> _entities;
    
        public EfRepository(OrderExchangeEntities context)
        {
            _context = context;
            _entities = _context.Set<TEntity>();
        }
    
        public List<TEntity> GetAll(ISpecification<TEntity> specification = null)
        {
            if (specification != null)
            {
                return _entities.Where(specification.Criteria).ToList();
            }
    
            return _entities.ToList();
        }
    
        public TEntity GetById(int id)
        {
            return _entities.Find(id);
        }
    
        public void Add(TEntity entity)
        {
            _entities.Add(entity);
        }
    
        public void Update(TEntity entity)
        {
            _entities.Attach(entity);
            _context.Entry(entity).State = EntityState.Modified;
        }
    
        public void Delete(TEntity entity)
        {
            _entities.Remove(entity);
        }
    
        public void AddRange(IEnumerable<TEntity> entities)
        {
            _context.Set<TEntity>().AddRange(entities);
        }
    }
    

    实施 IUnitOfWork :

    public class EFUnitOfWork : IUnitOfWork
    {
        private readonly OrderExchangeEntities _dbContext;
        private IDbTransaction _transaction;
    
        public EFUnitOfWork(OrderExchangeEntities dbContext)
        {
            _dbContext = dbContext;
        }
    
        public void BeginTransaction()
        {
            _transaction = _dbContext.Database.Connection.BeginTransaction();
        }
    
        public void Commit()
        {
            _dbContext.SaveChanges();
        }
    
        public IRepository<TEntity> GetRepository<TEntity>() where TEntity : class
        {
            return new EfRepository<TEntity>(_dbContext);
        }
    
        public void Rollback()
        {
            _transaction?.Rollback();
        }
    
        public void TransactionCommit()
        {
            try
            {
                _transaction?.Commit();
            }
            catch
            {
                _transaction?.Rollback();
            }
        }
    }
    

    如何在中使用此开始事务 OrderPaymentService ?

    public class OrderPaymentMessageService : IOrderPaymentMessageService
    {
    private readonly IRepository<OrderPaymentMessage> _orderPaymentMessageRepository;
    private readonly IUnitOfWork _unitOfWork;
    private readonly IAppLogger _applogger;
    private readonly IOrderService _orderServices;
    
    public OrderPaymentMessageService(IRepository<OrderPaymentMessage> orderPaymentMessageRepository, IUnitOfWork unitOfWork, IAppLogger applogger, IOrderService   orderServices)
    {
        _unitOfWork = unitOfWork;
        _orderPaymentMessageRepository = _unitOfWork.GetRepository<OrderPaymentMessage>();
        _applogger = applogger;
        _orderServices = orderServices;
    }
    
            public bool Create(OrderPaymentMessage orderPaymentMessage)
        {
            _unitOfWork.BeginTransaction();
    
            try
                {
    
    
                Guard.Against.Null(orderPaymentMessage, nameof(orderPaymentMessage));
                    
         _orderPaymentMessageRepository.Add(orderPaymentMessage);
        _unitOfWork.SaveChanges();
    
         var documwentsList=_userDocumentsService.GetAllDocumentsByOrderID(orderPaymentMessage.OrderID.GetValueOrDefault()).Select(x => x.Id).ToList();
    
                 bool isSucces=   _userDocumentsService.DeleteRange(documwentsList);
                 bool isSend=   _orderServices.MarkAdminSendPaymentMessage(1, 1,DateTime.Now);
                
            if (isSend)
                {
                    _unitOfWork.Commit();
                    return true;
                }
               else
                {
                    _unitOfWork.Rollback();
                    return false;
                }
               
                }
    
                catch (Exception ex)
                {
                _unitOfWork.Rollback();
                    _applogger.LogError(ex);
                    return false;
                }
            
    
               
            
           
        }
    
    public List<OrderPaymentMessageModel> GetMessageByOrderID(int orderID)
    {
        try
        {
            Guard.Against.Zero(orderID, nameof(orderID));
            var query =new  GetOrderPaymentMessageByOrderID(orderID);
            return _orderPaymentMessageRepository.GetAll(query).Select(x => new
               OrderPaymentMessageModel
            {
                OrderID = x.OrderID,
                ID = x.ID,
                Message = x.Message,
                CreatedDate = x.CreatedDate
            }
               ).ToList();
        }
        catch (Exception ex)
        {
            _applogger.LogError(ex);
            return null;
        }
    }
    
    
    public List<OrderPaymentMessageModel> GetMessageByOrderID(int orderID)
    {
        try
        {
            Guard.Against.Zero(orderID, nameof(orderID));
            var query =new  GetOrderPaymentMessageByOrderID(orderID);
            return _orderPaymentMessageRepository.GetAll(query).Select(x => new
               OrderPaymentMessageModel
            {
                OrderID = x.OrderID,
                ID = x.ID,
                Message = x.Message,
                CreatedDate = x.CreatedDate
            }
               ).ToList();
        }
        catch (Exception ex)
        {
            _applogger.LogError(ex);
            return null;
        }
    }
    }
    

    我想在中使用Begin事务 OrderPaymentMessageService 创建记录并使用事务更新订单记录。如果记录尚未更新,它将回滚。

    0 回复  |  直到 2 年前