回到目录

概念

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

实施步骤

  1. 实体继承ISoftDelete
  2. 数据上下文实现对IsDeleted的过滤
  3. 对删除方法进行调整,添加对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 / ;
}
}

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等!

欢迎大家的阅读与思考!

回到目录

最新文章

  1. [原]__FILE__宏
  2. vs------密钥
  3. (七)HTTP协议
  4. hdu 2199 Can you solve this equation?(二分搜索)
  5. Java 专业人士必备的书籍和网站列表
  6. AngularJS promise()
  7. php之面向对象(1)
  8. 使用docker构建简约高效的镜像
  9. socket学习
  10. Angular 双向数据绑定
  11. vue 选城市三级联动
  12. 火狐浏览器无故卡死,未响应或者占大量cpu资源解决方案
  13. 使用layer弹出Ueditor实现父子传值
  14. iot-dm异常日志
  15. 学习笔记13—python DataFrame获取行数、列数、索引及第几行第几列的值
  16. [UE4]先报告后广播模式
  17. winfrom 控件的显示隐藏方法
  18. 通过图片获取gps地理位置
  19. 基于jQuery功能非常强大的图片裁剪插件
  20. 快速获取APP对应的appPackage和appActivity

热门文章

  1. 安装Navicat for MySQL
  2. ROC曲线的概念和意义
  3. Postman----基础使用篇(没有接口文档的情况下如何着手做接口测试)
  4. java日志文件用法总结
  5. web service 的跨语言特性
  6. 机器学习web服务化实战:一次吐血的服务化之路
  7. Python爬虫实践 -- 记录我的第二只爬虫
  8. Qt之表格控件蚂蚁线
  9. 多线程学习系列二(使用System.Threading)
  10. Asp.net Core 2.1新功能Generic Host(通用主机),了解一下