1

对于需要软删除的数据库,我们有一个IsActive位列。为 false 时,表示该记录已被标记为已删除。

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

如果可能的话,我更喜欢扩展方法路线。

4

1 回答 1

0

您可以尝试在您的自定义 DefaultExpressionVisitor 上放置一个 IsActive 属性,并将其更改为在设置为 false 时不发挥其魔力,并将该 DefaultExpressionVisitor 的引用保留为单例(此单例将遵循与Transaction.Current 的静态属性,您只需将该单例保存在某处,但每个线程不同)。

创建另一个遵循与 TransactionScope 相同模式的类(“IncludeInactive”类)(它只需要实现 IDisposable),但在其构造函数上将单例 IsActive 属性设置为 false,并在其 Dispose 方法上将其设置为 true。

然后你会像这样使用它:

using(var inactive = new IncludeInactive())
{
    var query = queryable.Where(...);
}
于 2017-01-14T07:56:15.873 回答