1

Для нашей базы данных, которая требует мягких удалений, у нас есть столбец бит IsActive. Если false, это означает, что запись была отмечена как удаленная.Игнорирование выражения посетителя или IDbCommandTreeInterceptor

В течение 99% времени запросы должны включать только записи, у которых IsActive установлено значение true. В Entity Framework 6 мы используем настраиваемый DefaultExpressionVisitor (через IDbCommandTreeInterceptor), чтобы автоматически выполнить эту проверку, когда столбец существует в таблице.

Однако в очень редких случаях это поведение необходимо переопределить. Есть ли способ написать метод расширения для IQueryable или параметр в DbContext, который может проверять перехватчик выражения или идентификатор дерева команд?

Я надеюсь сделать что-то вроде

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

или

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

влиять на поведение, описанное выше, что в противном случае имело бы место при выполнении этого:

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

I Would предпочитайте маршрут метода расширения, если это возможно.

ответ

0

Вы можете попытаться поместить свойство IsActive в свой собственный DefaultExpressionVisitor и изменить его, чтобы он не делал свою магию, когда он установлен в false, а также сохраняет ссылку на этот DefaultExpressionVisitor в одноэлементный (этот синглтон будет следовать тот же шаблон, что и статическое свойство Transaction.Current, вам просто нужно оставить этот синглтон где-то, но другой для потока).

Создайте еще один класс (класс IncludeInactive), который следует за тем же шаблоном, что и TransactionScope (ему просто нужно реализовать IDisposable), но в его конструкторе его свойство singleton IsActive присваивается false и по его методу Dispose это правда.

Тогда вы бы использовать его как это:

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