回到目录

概念

ISoftDelete即软删除,数据在进行delete后不会从数据库清除,而只是标记一个状态,在业务范围里都不能获取到这个数据,这在ORM框架里还是比较容易实现的,对传统的ado来说需要对sql统一进行拦截和条件过滤.

实施步骤

  1. 实体继承ISoftDelete
  2. 数据上下文实现对IsDeleted的过滤
  3. 对删除方法进行调整,添加对ISoftDelete的支持

代码实现

1 实体继承ISoftDelete

  1. protected override void OnModelCreating(ModelBuilder modelBuilder)
  2. {
  3. foreach (var entityType in modelBuilder.Model.GetEntityTypes())
  4. {
  5. // 1. Add the IsDeleted property
  6. entityType.GetOrAddProperty("IsDeleted", typeof(bool));
  7.  
  8. // 2. Create the query filter
  9. var parameter = Expression.Parameter(entityType.ClrType);
  10.  
  11. // 3. EF.Property<bool>(post, "IsDeleted")
  12. var propertyMethodInfo = typeof(EF).GetMethod("Property").MakeGenericMethod(typeof(bool));
  13. var isDeletedProperty = Expression.Call(propertyMethodInfo, parameter, Expression.Constant("IsDeleted"));
  14.  
  15. // 4. EF.Property<bool>(post, "IsDeleted") == false
  16. BinaryExpression compareExpression = Expression.MakeBinary(ExpressionType.Equal, isDeletedProperty, Expression.Constant(false));
  17.  
  18. // 5. post => EF.Property<bool>(post, "IsDeleted") == false
  19. var lambda = Expression.Lambda(compareExpression, parameter);
  20.  
  21. modelBuilder.Entity(entityType.ClrType).HasQueryFilter(lambda);

2 数据上下文实现对IsDeleted的过滤

  1. public class ProductInfo : EntityBase, ISoftDelete
  2. {
  3. public string Title { get; set; }
  4. public decimal Amount { get; set; }
  5. public int Discount { get; set; }
  6. public int Inventory { get; set; }
  7. public DateTime DeletedDate { get; set; }
  8. public string DeletedUser { get; set; }
  9. public bool IsDeleted { get; set; }
  10.  
  11. /// <summary>
  12. /// domain method
  13. /// </summary>
  14. /// <returns></returns>
  15. public decimal GetSaleAmount()
  16. {
  17. return Amount * Discount / ;
  18. }
  19. }

3 对删除方法进行调整,添加对ISoftDelete的支持

代码来自Lind.DotNetCore.Repository.EFRepository类型

  1. public void Delete(TEntity item)
  2. {
  3. if (item != null)
  4. {
  5. if (typeof(ISoftDelete).IsAssignableFrom(item.GetType()))
  6. {
  7. Db.Entry(item).State = EntityState.Modified;
  8. var delEntity = item as ISoftDelete;
  9. delEntity.DeletedDate = DateTime.Now;
  10. delEntity.IsDeleted = true;
  11. }
  12. else
  13. {
  14. //物理删除
  15. Db.Set<TEntity>().Attach(item as TEntity);
  16. Db.Entry(item).State = EntityState.Deleted;
  17. Db.Set<TEntity>().Remove(item as TEntity);
  18. }
  19. this.SaveChanges();
  20. }
  21. }

上面几行代码实现了对软删除的完整支持,从ISoftDelete接口到数据上下文里的过滤IsDeleted,再到优化后的Delete()方法,一切看上去都很优雅!

对于软删除支持的框架也很多,像abp,eshopconationer,linddotnetcore等!

欢迎大家的阅读与思考!

回到目录

LindDotNetCore~ISoftDelete软删除接口的更多相关文章

  1. ABP 软删除ISoftDelete

    一.简介 ABP 的软删除是为了,在删除的时候,不是真正的删除数据,是为了保护数据. 二.具体实现 在 Core  层,我们需要这个实体去实现这个 ISoftDelete 接口.实现它的 public ...

  2. DDD Code First 迁移数据实现EF CORE的软删除,值对象迁移配置

    感谢Jeffcky大佬的博客: EntityFramework Core 2.0全局过滤 (HasQueryFilter) https://www.cnblogs.com/CreateMyself/p ...

  3. 深入理解 EF Core:使用查询过滤器实现数据软删除

    原文:https://bit.ly/2Cy3J5f 作者:Jon P Smith 翻译:王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能会去除一些本人实在不知道如何组织 ...

  4. 在FreeSQL中实现「触发器」和软删除功能

    前言 最近做新项目,技术栈 AspNetCore + FreeSQL 这个ORM真的好用,文档也很完善,这里记录一下两个有关「触发器」的功能实现 修改实体时记录更新时间 模型代码 我的模型都是基于这个 ...

  5. django之自定义软删除Model

    软删除 简单的说,就是当执行删除操作的时候,不正真执行删除操作,而是在逻辑上删除一条记录.这样做的好处是可以统计数据,可以进行恢复操作等等. 预备知识 Managers Managers 是djang ...

  6. ef core SoftDelete Multi-tenancy 软删除、多租户实现 Global Query Filters

    ef core提供了Global Query Filters特性来实现多租户与软删除,收集了一些实现方法. 最简单的例子时微软官方的特性解释. https://docs.microsoft.com/e ...

  7. tp5 model 中的软删除

    model中需use traits\model\SoftDelete; // 数据表中需添加一个 delete_time 字段保存删除时间 namespace app\index\model; use ...

  8. laravel框架总结(九) -- 软删除

    当模型被软删除时,它们并不会真的从数据库中被移除.而是会在模型上设置一个 deleted_at 属性并将其添加到数据库.如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空. ...

  9. 软删除脏数据job笔记

    某次处理一个case,发现线上库里有很多数据有问题.于是决定写一个job来将有问题的数据软删除掉.涉及到的两条SQL语句如下: <select id="loadTSKTVBillDai ...

随机推荐

  1. 查询订阅某topic的所有consumer group(Java API)

    在网上碰到的问题,想了下使用现有的API还是可以实现的. 首先,需要引入Kafka服务器端代码,比如加入Kafka 1.0.0依赖: Maven <dependency> <grou ...

  2. C++类中静态变量和普通变量的区别

    静态变量: 1.静态变量会被编到程序的exe里面,从程序启动到结束,它一直存在: 2.静态变量的初始化值为0: 3.全局变量默认是静态变量: 4.在类中的函数变量前面加了static的也是静态变量,只 ...

  3. Nginx隐藏index.php和配置vhost

    nginx启动命令 启动:nginx停止:nginx -s stop退出:nginx -s quit重启:nginx -s reopen重新加载:nginx -s reload平滑启动:kill -H ...

  4. 单台PC玩转NEUTRON(一:环境准备)

    要开始从事云计算网络领域的技术研究.过去10年一直是从事传统网络相关的工作,新的事务在知识结构上还有一些差异,边学边写,作为个人总结,也共享给大家. 工欲善其事必先利其器,好的开发调测环境让人学习工作 ...

  5. a标签跳转之前加点击事件

    ①在html标签中出现提示 <a href="http://www.baidu.com" onclick="if(confirm('确认百度吗?')==false) ...

  6. kubernetes进阶之四:Label和Label Selector

    一:什么是Label Label是Kubernetes系列中另外一个核心概念.是一组绑定到K8s资源对象上的key/value对.同一个对象的labels属性的key必须唯一.label可以附加到各种 ...

  7. Java ArrayList正确循环添加删除元素方法及分析

    在阿里巴巴Java开发手册中,有这样一条规定: 但是手册中并没有给出具体原因,本文就来深入分析一下该规定背后的思考. 一.foreach循环 foreach循环(Foreach loop)是计算机编程 ...

  8. 基于思科模拟器的AAA配置与验证

    拓扑图: 地址表如图所示 三个路由器之间采用ospf协议达到互通 先做ping通测试 由ApingB 由ApingC 配置AAA认证 在R1上 R1(config)#username shuaiqiy ...

  9. [小技巧]EF Core中如何获取上下文中操作过的实体

    原文地址:https://www.cnblogs.com/lwqlun/p/10576443.html 作者:Lamond Lu 源代码:https://github.com/lamondlu/EFC ...

  10. ReactJs 的各个版本生命周期、API变化 汇总(一、V16.0.0)

    目录 一.React 各个版本之间的纵向对比 二.React 的基础 1.Components and Props 三.React V 16.0.0 1. The Component Lifecycl ...