【问题标题】:How can I add an interceptor to a single query in Entity Framework?如何将拦截器添加到实体框架中的单个查询?
【发布时间】:2017-03-27 16:28:07
【问题描述】:

我有一个怀疑是参数嗅探的查询。我想应用一个类似于 here 的拦截器,但我不希望任何其他查询受到影响。

那里使用的代码是:DbInterception.Add(new OptionRecompileHintDbCommandInterceptor());

此命令的范围是什么?如何将拦截器的范围限制为单个查询?

我的第一个想法是做这样的事情:

var interceptor = new OptionRecompileHintDbCommandInterceptor();
try
{
    DbInterception.Add(interceptor);

    // Do query
}
finally
{
    DbInterception.Remove(interceptor);
}

但这是否相同,或者它会影响其他线程上的查询?

更新 我又想到了一个想法。如果我无法控制何时应用拦截器,有没有办法将逻辑放在拦截器的条件 if 语句中,然后向拦截器提供某种上下文,以便它知道何时应用逻辑?

【问题讨论】:

  • 考虑到您可以在静态构造函数中添加它,我认为它会影响所有查询。

标签: entity-framework entity-framework-6 interceptor


【解决方案1】:

对此我可以想到两个选项,因为它是在全局级别,在您要单独列出的查询中,您可以做一些您说 9 = 9 或始终正确的事情,这样您就知道了是您想要的查询。然后,您可以找到 where 子句部分并将其替换为空字符串,然后继续执行您要执行的任何操作。

另一个有点狡猾,但应该可以。在你的拦截器代码中,你可以这样做:

var ctx = interceptionContext.DbContexts.FirstOrDefault() As MyDbContext;

但是您应该能够将其转换为您的特定 DbContext 类型。在该 DbContext 类型上,您可以添加一些布尔属性来指示这是您正在运行的查询。然后,在运行它之前,您可以在其他任何地方将其设置为 true 并且您可以拦截它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    相关资源
    最近更新 更多