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

C# 在实体框架中设置数据库超时,c#,.net,asp.net-mvc,entity-framework,connection-timeout,C#,.net,Asp.net Mvc,Entity Framework,Connection Timeout,我的命令一直超时,因此我需要更改默认的命令超时值 我找到了myDb.Database.Connection.ConnectionTimeout,但它是只读的 如何在Entity Framework 5中设置命令超时?在您的上下文中尝试以下操作: public class MyDatabase : DbContext { public MyDatabase () : base(ContextHelper.CreateConnection("Connection s

我的命令一直超时,因此我需要更改默认的命令超时值

我找到了
myDb.Database.Connection.ConnectionTimeout
,但它是
只读的


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

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

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

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

<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>


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

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

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

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

我用流畅的实现扩展了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));
    } 
}

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

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

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

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


它非常简单,不需要强制转换。

对于Database first Aproach:

我们仍然可以通过以下方式覆盖ContextName.Context.ttT4模板,在构造函数中设置它:

<#=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;
<#
}
如果更改数据库模型,此模板将保留,但实际类将更新。

您可以使用此简单的

dbContext.Database.SetCommandTimeout(300)

我刚刚遇到了这个问题,并通过更新我的应用程序配置文件解决了它。对于所讨论的连接,指定“连接超时=60”(我使用的是EntityFramework版本5.0.0.0)


您应该在web配置中的连接字符串标记中进行更改,并在其构造函数中读取EntityFrameWork

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

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

    Database.CommandTimeout=Database.Connection.ConnectionTimeout


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

    我建议使用连接字符串版本,就像您尝试访问此构造函数中的
    ObjectContext
    一样。有时连接超时和命令超时以及两个独立的内容。连接字符串设置“连接超时”不会影响命令的运行时间(CommandTimeout)。我的问题有点不同。我在迁移期间超时了。EF有一个类似的属性可以在迁移期间使用:根据您使用的EF版本,请参阅了解如何指定CommandTimeout属性中的不同API。这对我不起作用(连接与命令不是我所怀疑的相同内容)。这篇文章解决了这个问题,仅供参考,在EF6上,
    数据库。CommandTimeout
    不再被读取-only@itsho他说的是
    数据库.Connection.ConnectionTimeout
    。无论如何,我想说,如果您的查询是超时查询(异常
    System.Data.Entity.Core.EntityCommandExecutionException
    包含
    System.Data.SqlClient.SqlException:Timeout expired,则
    Database.commandExecutionException
    是正确的选择。
    )。可能重复。我假设您实际上不关心连接超时,但您希望调整命令超时。对于我们使用EF的
    Fluent API
    形式非常有用。是否有方法可以使用一些配置文件在模板中指定超时。?不确定,是否有内置内容(我无法找到)。但是,您可以使用@shasand来代替硬编码180,我如何调用此扩展方法?连接超时!=命令超时!如前所述:连接超时!=命令超时。命令超时在这里很重要。这种方法是从连接字符串中动态读取它,而不是对它进行单独的设置。我没有注意到这个细节,这立即说明了此类黑客的问题。这是完全出乎意料的,不应该这样做。黑客检查应该在其他地方进行,我认为命令外的命令时间应该足够长,可以执行长查询或SQL命令。因此,网站管理员应该能够根据自己的需要控制这段时间,而无需通过更改命令超时时间获得新的发布。而不是滥用连接字符串中的连接超时设置!下一个应用程序管理器将其设置为其他值,而不知道其含义。记住,它还设置了连接超时(显然)。如果由于某些意外情况导致连接不可用,您不希望人们等待5分钟。
    public ContextName() : base("name=ContextName")
    {
        Database.CommandTimeout = 180;
    }