在实体框架中设置数据库超时


164

我的命令不断超时,因此我需要更改默认命令超时值。

我找到了myDb.Database.Connection.ConnectionTimeout,但是readonly

如何在Entity Framework 5中设置命令超时?


20
仅供参考,在Database.CommandTimeout
EF6上

2
@他正在谈论Database.Connection.ConnectionTimeout。无论如何,Database.CommandTimeout在您的查询超时(System.Data.Entity.Core.EntityCommandExecutionException包含的异常System.Data.SqlClient.SqlException: Timeout expired.)的情况下,我会说这是正确的做法。
David FerenczyRogožan16年


1
我假设您实际上并不关心CONNECTION超时,但是您想调整COMMAND超时。
Worthy7

Answers:


199

在您的环境中尝试以下操作:

public class MyDatabase : DbContext
{
    public MyDatabase ()
        : base(ContextHelper.CreateConnection("Connection string"), true)
    {
        ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 180;
    }
}

如果要在连接字符串中定义超时,请使用Connection Timeout以下连接字符串中的参数:

<connectionStrings>

<add name="AdventureWorksEntities"
connectionString="metadata=.\AdventureWorks.csdl|.\AdventureWorks.ssdl|.\AdventureWorks.msl;
provider=System.Data.SqlClient;provider connection string='Data Source=localhost;
Initial Catalog=AdventureWorks;Integrated Security=True;Connection Timeout=60;
multipleactiveresultsets=true'" providerName="System.Data.EntityClient" />

</connectionStrings>

来源:如何:定义连接字符串


1
我建议您使用连接字符串版本,就像您尝试ObjectContext在此构造函数中访问一样,有时PowerShell / NuGet控制台命令将以循环方式失败
凯文·高斯基

130
连接超时和CommandTimeout以及两个独立的事物。连接字符串设置“连接超时”不会影响命令运行的时间量(CommandTimeout)。
克莱伦哈特

3
我的问题有点不同。迁移期间我超时。EF具有要在迁移期间使用的类似属性:msdn.microsoft.com/en-us/library/…–
Karsten

2
根据所使用的EF版本,请查看此答案,以了解如何指定CommandTimeout属性的不同API。
Jim Aho 2014年

1
对我不起作用(连接与命令不是我怀疑的东西)。这篇文章通过stackoverflow.com/questions/6232633/entity-framework-timeouts
Jezbers 2015年

181

您可以使用 DbContext.Database.CommandTimeout = 180;

这很简单,不需要强制转换。


1
对于使用Fluent APIEF形式的我们非常有用。
GoldBishop '16

20

我的部分上下文如下:

public partial class MyContext : DbContext
{
    public MyContext (string ConnectionString)
        : base(ConnectionString)
    {
        this.SetCommandTimeOut(300);
    }

    public void SetCommandTimeOut(int Timeout)
    {
        var objectContext = (this as IObjectContextAdapter).ObjectContext;
        objectContext.CommandTimeout = Timeout;
    }
}

SetCommandTimeOut公开了,所以只修改了我需要花较长时间(超过5分钟)的例程,而不是全局超时。


9

在生成的构造函数代码中,应调用 OnContextCreated()

我添加了这个部分类来解决问题:

partial class MyContext: ObjectContext
{
    partial void OnContextCreated()
    {
        this.CommandTimeout = 300;
    }
}

8

我通过流畅的实现扩展了Ronnie的答案,因此您可以像这样使用它:

dm.Context.SetCommandTimeout(120).Database.SqlQuery...

public static class EF
{
    public static DbContext SetCommandTimeout(this DbContext db, TimeSpan? timeout)
    {
        ((IObjectContextAdapter)db).ObjectContext.CommandTimeout = timeout.HasValue ? (int?) timeout.Value.TotalSeconds : null;

        return db;
    }

    public static DbContext SetCommandTimeout(this DbContext db, int seconds)
    {
        return db.SetCommandTimeout(TimeSpan.FromSeconds(seconds));
    } 
}

8

对于数据库优先方法:

我们仍然可以在构造器中设置它,方法是重写ContextName.Context.tt T4模板:

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext
{
    public <#=code.Escape(container)#>()
        : base("name=<#=container.Name#>")
    {
        Database.CommandTimeout = 180;
<#
if (!loader.IsLazyLoadingEnabled(container))
{
#>
        this.Configuration.LazyLoadingEnabled = false;
<#
}

Database.CommandTimeout = 180; 是真正的改变。

生成的输出是这样的:

public ContextName() : base("name=ContextName")
{
    Database.CommandTimeout = 180;
}

如果更改数据库模型,该模板将保留,但是实际类将被更新。


有什么办法可以使用一些配置文件在Template中指定超时?
shas

1
不知道,是否有内置的东西(我找不到任何东西)。但是,您可以使用System.Configuration.ConfigurationManager.AppSettings["keyname"]@shas 来代替硬编码180,而是使用@shas
Christian Gollhardt

7

与其他答案相同,但作为扩展方法:

static class Extensions
{
    public static void SetCommandTimeout(this IObjectContextAdapter db, TimeSpan? timeout)
    {
        db.ObjectContext.CommandTimeout = timeout.HasValue ? (int?) timeout.Value.TotalSeconds : null;
    }
}

我怎么称呼这种扩展方法?
WandersonLópez18年

1

我只是遇到了这个问题,并通过更新应用程序配置文件解决了该问题。对于有问题的连接,请指定“ Connection Timeout = 60”(我正在使用实体框架版本5.0.0.0)

连接超时设置


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.