对于需要软删除的数据库,我们有一个IsActive
位列。如果为false,则表示记录已标记为已删除。
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 :(得分:0)
您可以尝试将IsActive属性设置为自定义DefaultExpressionVisitor,并将其更改为在设置为false时不执行其魔法,并将该DefaultExpressionVisitor的引用保留为单个(此单例将跟随与Transaction.Current的静态属性相同的模式,你只需将该单例保留在某处,但每个线程不同一个。)
创建另一个类(“IncludeInactive”类),它遵循与TransactionScope相同的模式(它只需实现IDisposable),但在其构造函数中,它将单例IsActive属性设置为false,并在其Dispose方法上设置它为真。
然后你会像这样使用它:
using(var inactive = new IncludeInactive())
{
var query = queryable.Where(...);
}