默认命令超时被忽略

时间:2017-09-28 15:55:29

标签: c# sql-server entity-framework entity-framework-6

背景:

遇到我们的生产系统中的问题,其中实体框架查询在30秒后没有超时。我们正在使用SQL Server 2014。

有一次,我们 看到超时(即如果我运行sql探测器跟踪,我们会看到它运行30秒然后抛出超时错误)。但是最近那些没有生成,我看到一些有问题的查询运行很长时间。当我们不再看到它们时,我没有特定的时间或变化。

这是数据库的第一个上下文。我们的Context.tt文件已经过修改,可以将两个存储过程的CommandTimeout更改为120秒,将另外6个存储过程更改为0(无限超时)。

public string FunctionTimeout(EdmFunction edmFunction, string modelNamespace)
    {
        if (edmFunction.Name == "StoredProc1" || edmFunction.Name == "StoredProc2")
            return string.Format("((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 120;");
        else if (edmFunction.Name == "StoredProc3" || edmFunction.Name == "StoredProc4" )
            return string.Format("((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 0;");
        else
            return "";
    }

我们的dbcontext在Autofac中注册如下

var builder = new ContainerBuilder();
builder.RegisterType<MyContext>().AsSelf().InstancePerLifetimeScope();

这是在Windows服务中运行,但数据层也与web api项目共享。

.NET Framework 4.5.2

实体框架6.1.3

Autofac 4.6.1

所以提问时间:

1)设置CommandTimeout是否将其设置为“全局”级别? (即一旦我们的系统碰巧调用上面的一个存储过程,那么之后的每个EF调用都没有超时或超时2分钟)

2)是否有一个钩子(在模板或其他地方)将其设置回常规EF调用之前的30秒(即在常规实体上的LINQ查询之前),而不仅仅是存储过程(即添加返回值)在上面的其他声明中)?

3)将CommandTimeout添加到构造函数帮助吗?

public <#=code.Escape(container)#>()
        : base("name=<#=container.Name#>")
    {
        ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 30;
<#
if (!loader.IsLazyLoadingEnabled(container))...

0 个答案:

没有答案