LindDotNetCore~ISoftDelete软删除接口
概念
ISoftDelete即软删除,数据在进行delete后不会从数据库清除,而只是标记一个状态,在业务范围里都不能获取到这个数据,这在ORM框架里还是比较容易实现的,对传统的ado来说需要对sql统一进行拦截和条件过滤.
实施步骤
- 实体继承ISoftDelete
- 数据上下文实现对IsDeleted的过滤
- 对删除方法进行调整,添加对ISoftDelete的支持
代码实现
1 实体继承ISoftDelete
protected override void OnModelCreating(ModelBuilder modelBuilder) { foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { // 1. Add the IsDeleted property entityType.GetOrAddProperty("IsDeleted", typeof(bool)); // 2. Create the query filter var parameter = Expression.Parameter(entityType.ClrType); // 3. EF.Property<bool>(post, "IsDeleted") var propertyMethodInfo = typeof(EF).GetMethod("Property").MakeGenericMethod(typeof(bool)); var isDeletedProperty = Expression.Call(propertyMethodInfo, parameter, Expression.Constant("IsDeleted")); // 4. EF.Property<bool>(post, "IsDeleted") == false BinaryExpression compareExpression = Expression.MakeBinary(ExpressionType.Equal, isDeletedProperty, Expression.Constant(false)); // 5. post => EF.Property<bool>(post, "IsDeleted") == false var lambda = Expression.Lambda(compareExpression, parameter); modelBuilder.Entity(entityType.ClrType).HasQueryFilter(lambda);
2 数据上下文实现对IsDeleted的过滤
public class ProductInfo : EntityBase, ISoftDelete { public string Title { get; set; } public decimal Amount { get; set; } public int Discount { get; set; } public int Inventory { get; set; } public DateTime DeletedDate { get; set; } public string DeletedUser { get; set; } public bool IsDeleted { get; set; } /// <summary> /// domain method /// </summary> /// <returns></returns> public decimal GetSaleAmount() { return Amount * Discount / 100; } }
3 对删除方法进行调整,添加对ISoftDelete的支持
代码来自Lind.DotNetCore.Repository.EFRepository类型
public void Delete(TEntity item) { if (item != null) { if (typeof(ISoftDelete).IsAssignableFrom(item.GetType())) { Db.Entry(item).State = EntityState.Modified; var delEntity = item as ISoftDelete; delEntity.DeletedDate = DateTime.Now; delEntity.IsDeleted = true; } else { //物理删除 Db.Set<TEntity>().Attach(item as TEntity); Db.Entry(item).State = EntityState.Deleted; Db.Set<TEntity>().Remove(item as TEntity); } this.SaveChanges(); } }
上面几行代码实现了对软删除的完整支持,从ISoftDelete接口到数据上下文里的过滤IsDeleted,再到优化后的Delete()方法,一切看上去都很优雅!
对于软删除支持的框架也很多,像abp,eshopconationer,linddotnetcore等!
欢迎大家的阅读与思考!
合集:
DotNetCore
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2017-02-28 RabbitMQ~广播消息
2017-02-28 大数据~说说Hadoop
2017-02-28 大数据~说说ZooKeeper
2017-02-28 RabbitMQ~消费者实时与消息服务器保持通话
2013-02-28 EF架构~对不起Include,是我冤枉你了!
2013-02-28 将不确定变为确定~DAL层向BLL层返回数据用IEnumerable<T>还是IQueryable<T>
2012-02-28 你必须要知道的架构知识~第一章 什么是项目架构