在entity framework中设置数据库超时

我的命令保持超时。 所以我需要改变默认的命令超时值。 我发现“myDb.Database.Connection.ConnectionTimeout”,但它是只读的。

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

试试你的上下文:

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

如果要在连接string中定义超时,请使用Connection Timeout参数,如下面的连接string所示:

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

来源: 如何:定义连接string

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

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

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

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

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

与其他答案一样,但作为扩展方法:

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

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

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

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

对于数据库第一Aproach:

我们仍然可以在构造函数中设置它,通过这种方式覆盖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; 是acutaly变化。

生成的输出是这样的:

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

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