Sar*_*ana 7 c# entity-framework entity-framework-core asp.net-core
我知道可以使用该context.Database.SetCommandTimeout方法设置命令超时。但这会更改使用同一实例进行的所有查询的超时DbContext。
我知道我可以设置超时,运行查询并重置超时,但这感觉就像一个黑客。我想设置每个查询的超时。类似于SqlCommand.CommandTimeout在 ADO.NET 中为每个查询设置的方式。使用 EF Core 可以做到这一点吗?
正如我在评论中所说,我认为这不是必要的或真正有用的。我对 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的源代码,添加这个功能会相对容易。
| 归档时间: |
|
| 查看次数: |
5058 次 |
| 最近记录: |