文件内容 PasteTransactionFilter.cs 1 KB 1794 字符
using Microsoft.AspNetCore.Mvc.Filters;
using ExampleApeart.EntityFrameworkCore;

namespace ExampleApeart.Application
{
    /// <summary>
    /// 事务回滚
    /// </summary>
    public class PasteTransactionFilter : IAsyncActionFilter
    {

        /*
         使用方式
                [TypeFilter(typeof(PasteTransactionFilter))]

         */

        /// <summary>
        /// 注意这个要申明为Scop方式,不能用瞬时方式
        /// </summary>
        private IExampleApeartDbContext _dbContext;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="dbContext"></param>
        public PasteTransactionFilter(IExampleApeartDbContext dbContext)
        {
            _dbContext = dbContext;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            await using var transaction = await _dbContext.Database.BeginTransactionAsync();
            try
            {
                // 执行控制器方法(包含所有SaveChanges调用)
                var resultContext = await next();

                // 检查是否有未处理的异常
                if (resultContext.Exception == null || resultContext.ExceptionHandled)
                {
                    // 没有异常或异常已处理,提交事务
                    await transaction.CommitAsync();
                }
                else
                {
                    // 发生未处理异常,回滚事务
                    await transaction.RollbackAsync();
                }
            }
            catch
            {
                // 发生异常,确保回滚
                await transaction.RollbackAsync();
                throw;
            }
        }
    }

}
​ ​