ASPNETZero软删除时如何校验关联表引用以阻止删除操作
ASP.NET Zero 软删除关联引用校验实现方案
实现逻辑
在调用原有软删除方法前,新增关联表引用校验,若存在引用则抛出业务异常终止删除流程。
具体实现步骤
1. 注入关联表仓储
先在当前应用服务的构造函数中,注入所有需要校验的关联表对应的仓储,示例如下(以OrderItem关联待删除Product实体为例):
private readonly IRepository<OrderItem, long> _orderItemRepository; // 构造函数注入 public YourEntityAppService(IRepository<OrderItem, long> orderItemRepository) { _orderItemRepository = orderItemRepository; }
2. 新增校验逻辑并整合到原有删除流程
在原有删除逻辑执行前添加校验,完整代码如下:
public override async Task DeleteAsync(TDeleteInput input) { // 新增:校验关联表是否存在引用记录 bool hasRelatedReference = await _orderItemRepository.GetAll() .AnyAsync(item => item.ProductId == input.Id); if (hasRelatedReference) { // 抛出ABP内置友好业务异常,会自动返回格式化错误信息到前端 throw new UserFriendlyException("删除失败", "当前数据存在关联业务引用,无法删除"); } // 原有软删除逻辑 var query = Repository.GetAll() .Where("Id == @0", input.Id) .ProjectTo<TDto>(ItemMapper); var dto = await AsyncExecuter.SingleAsync(query, true); await base.DeleteAsync(input); await CurrentUnitOfWork.SaveChangesAsync(); await EventBus.TriggerAsync(new DestroyEvent<TDto>(dto)); }
扩展说明
- 若有多个关联表需要校验,可依次查询每个表的关联记录,只要存在任意一个引用就抛出异常
- 通用校验逻辑可以提取为单独的方法或者领域服务,避免多场景复用时代码冗余
- 可搭配数据库外键约束作为兜底校验,避免业务层漏判导致脏数据
内容的提问来源于stack exchange,提问作者nirav shah
相关产品推荐
相关产品推荐

