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 臨時禁用軟刪除,即可查詢出所有數據。
關於更多數據過濾內容,請閱讀官網文檔。