我的命令保持超时,所以我需要更改默认命令超时值。
我找到myDb.Database.Connection.ConnectionTimeout
,但它是readonly
。
如何在 Entity Framework 5 中设置命令超时?
答案 0 :(得分:183)
在您的背景下尝试:
public class MyDatabase : DbContext
{
public MyDatabase ()
: base(ContextHelper.CreateConnection("Connection string"), true)
{
((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 180;
}
}
如果要在连接字符串中定义超时,请使用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>
答案 1 :(得分:158)
您可以使用DbContext.Database.CommandTimeout = 180;
非常简单,无需演员表。
答案 2 :(得分:20)
我的部分背景如下:
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分钟)的例程而不是全局超时。
答案 3 :(得分:8)
我通过流畅的实现扩展了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));
}
}
答案 4 :(得分:8)
在生成的构造函数代码中,它应该调用OnContextCreated()
我添加了这个部分类来解决问题:
partial class MyContext: ObjectContext
{
partial void OnContextCreated()
{
this.CommandTimeout = 300;
}
}
答案 5 :(得分:7)
与其他答案相同,但作为扩展方法:
static class Extensions
{
public static void SetCommandTimeout(this IObjectContextAdapter db, TimeSpan? timeout)
{
db.ObjectContext.CommandTimeout = timeout.HasValue ? (int?) timeout.Value.TotalSeconds : null;
}
}
答案 6 :(得分:7)
对于数据库优先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;
是真正的改变。
生成的输出是:
public ContextName() : base("name=ContextName")
{
Database.CommandTimeout = 180;
}
如果您更改数据库模型,此模板将保留,但实际课程将更新。
答案 7 :(得分:1)
我只是遇到了这个问题,并通过更新应用程序配置文件解决了该问题。对于有问题的连接,请指定“ Connection Timeout = 60”(我正在使用5.0.0.0版的实体框架)
答案 8 :(得分:0)
您可以使用这个简单的方法
:
dbContext.Database.SetCommandTimeout(300);
答案 9 :(得分:-2)
您应该在 Web 配置中的连接字符串标记中进行更改,并使 EntityFrameWork 在其构造函数中从中读取。
将此术语添加到 web.config 连接字符串: 连接超时=300;
在构造函数中添加以下代码:
Database.CommandTimeout = Database.Connection.ConnectionTimeout;
通过这种方法,您将使用户能够控制超时,而无需为他进行新的发布。