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。

对于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 临时禁用软删除,即可查询出所有数据。

 

关于更多数据过滤内容,请阅读官网文档。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章