CSharp-Single-EFCore/Bunny.Common/Context/Database/TransactionInterceptor.cs

34 lines
1.1 KiB
C#

using Bunny.Common.Exception;
using Bunny.Dao.Common.Constant;
using Microsoft.EntityFrameworkCore.Diagnostics;
namespace Bunny.Common.Context.Database;
public class TransactionInterceptor : SaveChangesInterceptor
{
// 重写 SavingChanges 方法
public override InterceptionResult<int> SavingChanges(DbContextEventData eventData, InterceptionResult<int> result)
{
// 如果当前上下文存在事务,则直接返回结果
if (eventData.Context!.Database.CurrentTransaction != null) return result;
// 开始数据库事务
using var transaction = eventData.Context.Database.BeginTransaction();
try
{
// 调用基类方法继续保存更改
result = base.SavingChanges(eventData, result);
// 如果保存更改成功,则提交事务
transaction.Commit();
}
catch (System.Exception)
{
// 如果保存更改失败,则回滚事务并抛出自定义异常
transaction.Rollback();
throw new BunnyException(ExceptionConstant.DataBaseError);
}
return result;
}
}