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

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

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

如何在 实体框架5中设置命令超时?

276135 次浏览

在你的上下文中试试这个:

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>

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

我的部分语境是这样的:

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; // seconds

很简单,不需要石膏。

数据库优先方法:

我们仍然可以通过覆盖 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;
}

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

你可以用这个简单的 : < br/> dbContext.Database.SetCommandTimeout(300);

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

ConnectionTimeout 设置

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

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

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

    Database.CommandTimeout = Database.Connection. ConnectionTimeout;

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