我的命令一直超时,因此我需要更改默认的命令超时值。
我找到了 myDb.Database.Connection.ConnectionTimeout
,但它是只读的。
我该如何在 Entity Framework 5 中设置命令超时?
我的命令一直超时,因此我需要更改默认的命令超时值。
我找到了 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
}
}
如果你想在连接字符串中定义超时时间,可以使用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>
来源:如何定义连接字符串
CommandTimeout
为空。我按照 @leniel-macaferi 的建议设置了 CommandTimeout
,并解决了超时问题。-因此它们不是同一件事,并且都需要设置才能在 EF 中启用自定义超时。 - Nebu您可以使用DbContext.Database.CommandTimeout = 180; // seconds
这非常简单,无需进行类型转换。
我的部分上下文如下:
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分钟)的程序才会被修改,而不是全局超时。
在生成的构造函数代码中,应该调用 OnContextCreated()
我添加了这个部分类来解决问题:
partial class MyContext: ObjectContext
{
partial void OnContextCreated()
{
this.CommandTimeout = 300;
}
}
针对数据库优先的方法:
我们仍然可以通过重写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;
}
System.Configuration.ConfigurationManager.AppSettings[“keyname”]
代替直接硬编码数字180。 @shas - Christian Gollhardtdm.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;
}
}
dbContext.Database.SetCommandTimeout(300);
try
{ using (MyEntities Mydb = new MyEntities())
{
(Mydb as System.Data.Entity.Infrastructure.IObjectContextAdapter).ObjectContext.CommandTimeout = 600;
Mydb.LongRunningSproc();
}
}
catch (System.Data.Common.DbException ex)
{
throw new Exception(SomeMessageHere);
}
Database.CommandTimeout
不再是只读的。 - itshoDatabase.Connection.ConnectionTimeout
。无论如何,我认为如果你的查询超时(异常System.Data.Entity.Core.EntityCommandExecutionException
包含System.Data.SqlClient.SqlException: Timeout expired.
),那么Database.CommandTimeout
才是正确的选择。 - David Ferenczy Rogožan