为什么在第二次查询时跳过了IDbCommandTreeInterceptor?

问题描述:

使用实体框架我已经使用IDbCommandTreeInterceptor实施了软删除&数据级别限制。对于使用上下文的第一个查询,拦截器会被击中。但再次尝试(刷新浏览器),拦截器会被跳过。我已通过使用SQL Server Management Studio更改某些数据来检查数据是否正在缓存。反映的变化,但拦截器仍然跳过。可能导致这种情况发生的原因是什么?为什么在第二次查询时跳过了IDbCommandTreeInterceptor?

+0

那么通过拦截器跳过你的意思是目标实体是否真的被删除而不是“软”被删除? – Evk

+0

软删除后返回软删除对象 –

+0

调试时也会跳过拦截器。 –

according to the sources comments这是预期的行为

命令树两种数据库查询,插入/更新/删除 命令。然而,查询 命令树被模型缓存,这意味着该命令树创建只发生在执行查询 第一时间和该通知仅会在那个时候

发生,因为你的拦截结果不能依赖的结果关于数据。

+0

可以理解,但仍有一点令人困惑的是,如果我运行新的查询,拦截器会被击中(对于旧查询),然后通过EF重新运行旧查询。但是,如果两个查询都已经执行过一次,那么拦截器会被交替地跳过,直到执行新的查询。然后Interceptor被新命令和两个旧查询命中。 –

+0

@JohnStaurt确实出乎意料。您是否修改了配置的queryCache部分(请参阅https://blogs.msdn.microsoft.com/premier_developer/2017/03/23/entity-framework-query-caching/)? – jbl