如何为DbContext设置CommandTimeout?

Yar*_*ara 59 c# entity-framework-4 command-timeout dbcontext

我正在寻找为DbContext设置CommandTimeout的方法.搜索之后,我通过将DbContext转换为ObjectContext并为objectContext的CommandTimeout属性设置值来找到方法.

var objectContext = (this.DbContext as IObjectContextAdapter).ObjectContext;
Run Code Online (Sandbox Code Playgroud)

但我必须使用DbContext.

Jon*_*oln 93

它将适用于您的方法.

或者它的子类(来自msdn论坛)

public class YourContext : DbContext
{
  public YourContext()
    : base("YourConnectionString")
  {
    // Get the ObjectContext related to this DbContext
    var objectContext = (this as IObjectContextAdapter).ObjectContext;

    // Sets the command timeout for all the commands
    objectContext.CommandTimeout = 120;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用`as`有什么意义?这不会只是将`InvalidCastException`变成`NullReferenceException`吗?我认为前者更加清晰. (17认同)
  • 请参阅 Perry Tribolet 的解决方案。简单多了。 (2认同)
  • 如果您像我一样想知道,CommandTimeout 以秒为单位表示。 (2认同)

Per*_*let 22

var ctx = new DbContext();
ctx.Database.CommandTimeout = 120;
Run Code Online (Sandbox Code Playgroud)

  • 我在这个页面上,因为我有生产代码这样做,并且设置被忽略. (2认同)
  • 请注意,此值似乎不会传播到通过 Connection.CreateCommand 为同一上下文的 Connection 属性创建的 DbCommand 的 CommandTimeout 属性。您可能需要手动设置。 (2认同)

Rej*_*esh 21

这可能对你有所帮助.

public class MyContext : DbContext
{    
    public MyContext () : base(ContextHelper.CreateConnection("my connection string"), true)
    {
        ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 300;
    }
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*ger 6

我发现更改.tt文件对我有用,因为我不会在以后丢失更改:

添加此行:

((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 300;
Run Code Online (Sandbox Code Playgroud)

在DbContext创建者之后和!loader.IsLazy构造之前:

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
{
    public <#=code.Escape(container)#>()
        : base("name=<#=container.Name#>")
    {
        ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 300;
<#
if (!loader.IsLazyLoadingEnabled(container))
Run Code Online (Sandbox Code Playgroud)

它应该出现在您生成的Context.cs中:

public MyEntities()
            : base("name=MyEntities")
        {
            ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 300;
        }
Run Code Online (Sandbox Code Playgroud)