如何在 ASP.NET MVC 5 的 EF 中使用 Begin Transaction?

问题描述 投票:0回答:0

我的项目有三层

  1. 应用核心
  2. 基础设施
  3. 用户界面

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)
    {
            try
            {
                Guard.Against.Null(orderPaymentMessage, nameof(orderPaymentMessage));
                _orderPaymentMessageRepository.Add(orderPaymentMessage);
                _unitOfWork.Commit();
 
                return true;
            }
            catch (Exception ex)
            {
                _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;
        }
    }
}

我想在

OrderPaymentMessageService
创建方法中使用Begin transaction并使用transaction更新Order Record

entity-framework asp.net-mvc-5 repository-pattern clean-architecture
© www.soinside.com 2019 - 2024. All rights reserved.