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 臨時禁用軟刪除,即可查詢出所有數據。

 

關於更多數據過濾內容,請閱讀官網文檔。

 

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