1

부드러운 삭제가 필요한 데이터베이스의 경우 IsActive 비트 열이 있습니다. false이면 레코드가 삭제 된 것으로 표시됩니다.표현식 방문자 또는 IDbCommandTreeInterceptor 무시

99 %의 시간 동안 쿼리에는 IsActive이 true로 설정된 레코드 만 포함되어야합니다. Entity Framework 6에서는 사용자 정의 DefaultExpressionVisitor (IDbCommandTreeInterceptor 통해)을 사용하여 테이블에 열이 존재할 때 자동으로이 확인 작업을 수행합니다.

그러나 매우 드문 경우이지만이 동작을 재정의해야합니다. 표현식 방문자 또는 명령 트리 인터셉터가 확인할 수있는 IQueryable 또는 DbContext의 확장 메서드를 작성하는 방법이 있습니까? 내가 것

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

:이 작업을 수행 할 때

나는 그렇지 않으면 발생할 수있는 그 위에서 설명한 동작에 영향을

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

또는

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

같은 뭔가를 바라고 있어요 가능한 경우 확장 방법 경로를 선호하십시오.

답변

0

IsActive 속성을 사용자 지정 DefaultExpressionVisitor에 넣고 false로 설정하면 마법을 수행하지 않도록 변경하고 해당 DefaultExpressionVisitor에 대한 참조를 싱글 톤으로 유지할 수도 있습니다 (이 싱글 톤은 Transaction.Current의 정적 속성과 같은 패턴, 당신은 그 싱글 톤을 어딘가에 유지해야하지만 스레드 당 다른 싱글 톤을 유지해야합니다).

TransactionScope (IDisposable을 구현하기 만하면)와 동일한 패턴을 따르는 다른 클래스 ("IncludeInactive"클래스)를 만들고 해당 생성자에서 singleton IsActive 속성을 false로 설정하고 Dispose 메서드에서 set 그것은 사실입니다.

그럼 당신은 다음과 같이 사용합니다 :

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