EF Core软删除核心是用查询过滤器自动屏蔽IsDeleted为true的数据,需添加IsDeleted字段、配置HasQueryFilter、重写SaveChanges将Delete转为Update,并可用IgnoreQueryFilters临时绕过。
EF Core 实现软删除,核心是用 查询过滤器(Query Filter) 自动屏蔽已标记为“删除”的数据,而不是真正从数据库删掉。它不依赖手写 .Where(!x.IsDeleted),而是让每次查询都透明生效——既安全又省心。
在要支持软删除的实体类里,添加布尔类型的标记属性:
IsDeleted,类型为 bool,默认值设为 false

DeletedAt、DeletedBy 字段重写 OnModelCreating 方法,为实体启用全局过滤:
modelBuilder.Entity().HasQueryFilter(p => !p.IsDeleted);
TINYINT)?加上值转换:.Property(e => e.IsDeleted).HasConversion()
IDeletable 接口的类型,自动注册过滤器调用 Remove() 时,EF 默认会生成 DELETE SQL。要改成软删除,得拦截保存前的操作:
SaveChanges 和 SaveChangesAsync
ChangeTracker.Entries(),对 EntityState.Deleted 的条目改为 Modified,并把 IsDeleted 设为 true
IsDeleted 默认为 false(可在 Added 分支中设置)管理后台或恢复功能常需看到全部记录,这时可以用:
context.Posts.IgnoreQueryFilters().Where(p => p.IsDeleted).ToList()IgnoreQueryFilters() 会跳过该实体上所有过滤器,不只是软删除那个基本上就这些。不复杂但容易忽略细节,比如没改 SaveChanges 行为会导致物理删除,或者忘了给关联实体配过滤器导致数据不一致。