1

對於我們需要軟刪除的數據庫,我們有一個IsActive位列。如果爲false,則表示記錄已被標記爲已刪除。忽略表達式訪問者或IDbCommandTreeInterceptor

對於99%的時間,查詢應該只包含IsActive設置爲true的記錄。在實體框架6中,我們使用自定義的DefaultExpressionVisitor(通過IDbCommandTreeInterceptor)在列存在於表上時自動進行此檢查。

但是,在極少數情況下,這種行爲需要被覆蓋。有沒有辦法爲IQueryable編寫擴展方法,或者在DbContext上設置表達式訪問者或命令樹攔截器可以檢查的設置?

我希望能像做

var query = queryable.IncludeInactive().Where(...); 

_dbContext.IncludeInactive = true; 
var query = queryable.Where(...); 
_dbContext.IncludeInactive = false; 

影響上面所描述的行爲,否則將會發生這樣的時候:

var query = queryable.Where(...); 

我會如果可能,更喜歡擴展方法路由。

回答

0

您可以嘗試將IsActive屬性放在您的自定義DefaultExpressionVisitor上,並將其設置爲false時將其更改爲不做它的魔法,並且還將該DefaultExpressionVisitor的引用保存爲單例(此單例將遵循與Transaction.Current的靜態屬性相同的模式,你只需要將該單例保存在某個地方,但每個線程都有一個不同的單例)。

創建另一個遵循與TransactionScope相同模式的類(「IncludeInactive」類)(它只需實現IDisposable),但在其構造函數中它將單例IsActive屬性設置爲false,並在Dispose方法上設置它是真的。

然後你會使用這樣的:

using(var inactive = new IncludeInactive()) 
{ 
    var query = queryable.Where(...); 
}