如何在 EF Core 中设置单个查询的命令超时?

Sar*_*ana 7 c# entity-framework entity-framework-core asp.net-core

我知道可以使用该context.Database.SetCommandTimeout方法设置命令超时。但这会更改使用同一实例进行的所有查询的超时DbContext

我知道我可以设置超时,运行查询并重置超时,但这感觉就像一个黑客。我想设置每个查询的超时。类似于SqlCommand.CommandTimeout在 ADO.NET 中为每个查询设置的方式。使用 EF Core 可以做到这一点吗?

xan*_*tos 2

正如我在评论中所说,我认为这不是必要的或真正有用的。我对 EF Core 的代码进行了一些调试(使用 VS 2019 非常容易,通过让它从 nuget 服务器加载符号或强制其反编译为源代码)。我们可以调用一些“插入点”,您可以在其中注入一些内容来修改SetCommandTimeout单个查询。例如对于 LINQ 查询

public class MyCommandInterceptor : DbCommandInterceptor
{
    public override InterceptionResult<DbDataReader> ReaderExecuting(DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result)
    {
        return base.ReaderExecuting(command, eventData, result);
    }
}
Run Code Online (Sandbox Code Playgroud)

.AddInterceptors(new MyCommandInterceptor()); 
Run Code Online (Sandbox Code Playgroud)

放在你配置的地方DBContext可能是最好的地方。当拦截器运行时,DbCommand command已经设置了标准Timeout,您可以更改它。问题很明显是设置您想要的超时并将此信息传递给拦截器。这很复杂,我不确定是否有好的解决方案(我认为有各种丑陋的解决方案......在查询构建期间添加信息并让拦截器知道这些信息似乎很困难)

如果您有兴趣,它DbCommand是在 中创建的Microsoft.EntityFrameworkCore.Storage.CreateDbCommand()

如果你想要预先打包的东西,答案是否定的,什么也没有。显然,您可以自由地将其建议为efcore github中的功能。如果修改EF的源代码,添加这个功能会相对容易。