【问题标题】:Ignoring an expression visitor or IDbCommandTreeInterceptor忽略表达式访问者或 IDbCommandTreeInterceptor
【发布时间】:2016-12-01 19:25:11
【问题描述】:

对于需要软删除的数据库,我们有一个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(...);

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

【问题讨论】:

    标签: c# entity-framework entity-framework-6 expressionvisitor


    【解决方案1】:

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

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

    然后你会这样使用它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2020-08-06
      • 2016-03-30
      相关资源
      最近更新 更多