1

ソフト削除が必要なデータベースについては、IsActiveビットの列があります。 falseの場合、レコードが削除済みとマークされたことを示します。式ビジターまたはIDbCommandTreeInterceptorを無視する

時間の99%の間、クエリは、IsActiveがtrueに設定されているレコードのみを含める必要があります。 Entity Framework 6では、カスタムDefaultExpressionVisitorIDbCommandTreeInterceptor経由)を使用して、テーブルに列が存在するときに自動的にこのチェックを行います。

ただし、ごくまれにこの動作を無効にする必要があります。式のビジターまたはコマンドツリーインターセプタがチェックできるIQueryableの拡張メソッドまたはDbContextの設定を記述する方法はありますか?私は希望

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

:これを行うとき

私は、そうでない場合に発生すること、上記の動作に影響を与えるために

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

または

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

ような何かを望んでいます可能であれば、拡張メソッドのルートを優先します。

答えて

0

カスタムDefaultExpressionVisitorにIsActiveプロパティを設定し、falseに設定されているときにその魔法を行わないように変更し、そのDefaultExpressionVisitorの参照をシングルトンに保持することもできます(このシングルトンはTransaction.Currentの静的プロパティと同じパターンですが、そのシングルトンはどこか別の場所に置かなければなりませんが、スレッドごとに別のものを保持するだけです)。

TransactionScopeと同じパターン(IDisposableを実装する必要がある)に続く別のクラス( "IncludeInactive"クラス)を作成しますが、そのコンストラクタでは、Singleton IsActiveプロパティをfalseに設定し、Disposeメソッドに対してsetそれは本当です。

その後、あなたはこのようにそれを使用します。

using(var inactive = new IncludeInactive()) 
{ 
    var query = queryable.Where(...); 
} 
関連する問題