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(...); 
}