Boilerplate 0.9.6硬删除异常:PermanentlyDeleteDeal方法未触发咨询
解决Boilerplate 0.9.6中硬删除软删除记录的问题
嘿,我来帮你捋捋这个问题~你遇到的核心问题其实是ABP Boilerplate 0.9.6默认的软删除机制在“搞事情”,咱们一步步拆解解决:
为什么你的PermanentlyDeleteDeal方法没进入执行逻辑?
最可能的原因是ABP的软删除过滤器自动过滤了已标记为软删除的记录:
- 如果你是通过ABP自带的仓储(比如
IRepository<Deal>)来查询待删除的实体,仓储会自动应用软删除过滤器,根本查不到已经被软删除的Deal记录,自然就跳过后续的删除逻辑了。 - 另外也可以检查下方法上有没有加ABP的拦截特性(比如权限验证、事务拦截),如果权限不足或者事务没正确开启,也可能导致方法逻辑没执行。
直接通过DataContext实现硬删除的正确姿势
既然Boilerplate 0.9.6不支持原生硬删除,咱们直接绕开过滤器操作DataContext就行,关键是要先禁用软删除过滤器,才能拿到已软删除的实体:
方案1:在应用服务中直接操作DataContext
public void PermanentlyDeleteDeal(GetDealInput input) { // 开启工作单元,确保事务一致性 using (var uow = _unitOfWorkManager.Begin()) { // 禁用软删除过滤器,这样才能查到已软删除的记录 _dataContext.DisableFilter(AbpDataFilters.SoftDelete); // 查询目标实体 var targetDeal = _dataContext.Deal.FirstOrDefault(d => d.Id == input.DealId); if (targetDeal != null) { // 执行硬删除 _dataContext.Deal.Remove(targetDeal); _dataContext.SaveChanges(); } uow.Complete(); } }
方案2:在DataContext中封装硬删除方法
如果你希望把逻辑封装在DataContext里,可以这么写:
public class DataContext : DbContext { public virtual DbSet<Deal> Deal{ get; set; } public DataContext() : base("Default") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { // 你的现有配置... base.OnModelCreating(modelBuilder); } // 封装硬删除方法 public void PermanentlyDeleteDeal(int dealId) { // 禁用软删除过滤器 this.DisableFilter(AbpDataFilters.SoftDelete); var deal = Deal.FirstOrDefault(d => d.Id == dealId); if (deal != null) { Deal.Remove(deal); this.SaveChanges(); } } }
然后在应用服务里直接调用_dataContext.PermanentlyDeleteDeal(input.DealId)即可,记得也要在工作单元范围内调用哦。
注意事项
- 确保引用了
Abp.EntityFramework命名空间,AbpDataFilters.SoftDelete是ABP内置的软删除过滤器常量。 - 所有操作必须在**工作单元(UnitOfWork)**范围内执行,否则过滤器的禁用和数据保存可能不会生效。
- 如果你之前用仓储查询,一定要换成直接操作
DataContext,因为仓储会强制应用软删除过滤器。
内容的提问来源于stack exchange,提问作者Shonie
相关产品推荐
相关产品推荐

