ABP-VNEXT 学习笔记(三)数据过滤之ISoftDelete
ISoftDeleted,是abp自带的逻辑删除约定,也叫软删除。
该接口中定义了IsDeleted 变量。
命名空间为:
using Volo.Abp;
它是可以实现我们对逻辑删除和硬删除的无感操作。就是我们不需要特意写代码处理,只需要调用方法即可。
在查询中,默认也会过滤掉 IsDeleted=true的数据。
当然,我们也可以通过其他方式获取所有数据,包含已删除的。
下面上代码,我们现在domain域服务层定义的实体添加ISoftDeleted接口的继承,如下图:
public class Tenant:BasicAggregateRoot<Guid>,ISoftDelete { public DateTime CreateTime { get; set; } public DateTime UpdateTime { get; set; } public string Name { get; set; } /// <summary> /// 数据库连接字符串 /// </summary> public string ConnectionString { get; set; } /// <summary> /// 备注 /// </summary> public string Note { get; set; } /// <summary> /// 联系人 /// </summary> public string Contacts { get; set; } /// <summary> /// 手机号码 /// </summary> public string Mobile { get; set; } public bool IsDeleted { get; set; } /// <summary> /// 导航属性 /// </summary> // public virtual ICollection<TenantDomain> TenantDomains { get; set; } }
接下来记录一下,在application层,做业务处理时,怎么来应用这个软删除。
对于执行 insert 方法,有一点需要特别注意:
如果你使用的是codefirst模式,采用数据库迁移,那没问题。
如果你是dbfirst,先建数据库结构,这时候 数据库中IsDeleted 字段必须设置默认值为0(false),否则insert会失败。
对于insert方法,IsDeleted 字段不能为false,abp内部机制处理了,只能依托于数据库设置的默认值。但是insert时,代码中可以设置为true。
对于update方法,不影响,可根据业务逻辑设置 true和false。
对于delete方法,如果实体有继承了ISoftDeleted,则调用DeleteAsync或者DeleteManyAsync方法时,就是进行逻辑删除,将IsDeleted设置为true。如果要硬删除,可调用方法HardDeleteAsync,该方法在仓储的扩展当中,需要引入命名空间:Volo.Abp.Domain.Repositories;。
对于query查询,默认是自动过滤掉软删除的数据。这里重点讲一下,如果要把已删除的数据也读取出来,应该怎么写。
这个就需要阅读abp的数据过滤 章节的内容。
https://docs.abp.io/zh-Hans/abp/latest/Data-Filtering
首先要注入IDataFilter 数据过滤对象:
public IDataFilter dataFilter { get; set; }
命名空间为
using Volo.Abp.Data;
以上采用autofac注入,若使用netcore自带di,则按照netcore方式注入。
using (dataFilter.Disable<ISoftDelete>()) //取消软删除的过滤 { //这里写查询代码 }
利用dataFilter 临时禁用软删除,即可查询出所有数据。
关于更多数据过滤内容,请阅读官网文档。
更多分享,请大家关注我的个人公众号: