176

我的命令一直超时,所以我需要更改默认的命令超时值。

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

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

4

10 回答 10

213

在您的上下文中尝试此操作:

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

如果要在连接字符串中定义超时,请使用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>

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

于 2012-10-08T20:29:22.913 回答
195

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

这很简单,不需要演员表。

于 2014-05-21T01:35:38.923 回答
21

我的部分上下文如下所示:

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 分钟)而不是全局超时的例程。

于 2012-10-08T20:34:56.563 回答
10

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

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

partial class MyContext: ObjectContext
{
    partial void OnContextCreated()
    {
        this.CommandTimeout = 300;
    }
}
于 2014-03-25T10:46:58.127 回答
9

我用一个流畅的实现扩展了 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));
    } 
}
于 2013-07-17T20:30:45.880 回答
9

对于数据库优先方法:

我们仍然可以在构造函数中设置它,通过这样覆盖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;
}

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

于 2016-06-18T01:33:38.127 回答
8

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

static class Extensions
{
    public static void SetCommandTimeout(this IObjectContextAdapter db, TimeSpan? timeout)
    {
        db.ObjectContext.CommandTimeout = timeout.HasValue ? (int?) timeout.Value.TotalSeconds : null;
    }
}
于 2013-05-08T13:01:25.630 回答
1

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

连接超时设置

于 2020-04-24T16:37:16.210 回答
1

你可以使用这个简单的:
dbContext.Database.SetCommandTimeout(300);

于 2019-12-03T09:53:07.460 回答
-2

您应该在 Web 配置中的 Connection String 标记中进行更改,并使 EntityFrameWork 在其构造函数中从中读取。

  1. 将此术语添加到 web.config 连接字符串:连接超时 = 300;

  2. 在构造函数中添加以下代码:

    Database.CommandTimeout = 数据库.Connection.ConnectionTimeout;

通过这种方法,您将使用户能够控制超时,而无需为他进行新的发布。

于 2021-04-02T08:41:11.763 回答