C# 在实体框架中设置数据库超时
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12788972/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Set database timeout in Entity Framework
提问by James
My command keeps timing out, so I need to change the default command timeout value.
我的命令一直超时,所以我需要更改默认的命令超时值。
I've found myDb.Database.Connection.ConnectionTimeout, but it's readonly.
我找到了myDb.Database.Connection.ConnectionTimeout,但它是readonly。
How can I set the command timeout in Entity Framework 5?
如何在Entity Framework 5 中设置命令超时?
采纳答案by Leniel Maccaferri
Try this on your context:
在您的上下文中尝试此操作:
public class MyDatabase : DbContext
{
public MyDatabase ()
: base(ContextHelper.CreateConnection("Connection string"), true)
{
((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 180;
}
}
If you want to define the timeout in the connection string, use the Connection Timeoutparameter like in the following connection string:
如果要在连接字符串中定义超时,请使用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>
Source: How to: Define the Connection String
来源:如何:定义连接字符串
回答by Erik Philips
My partial context looks like:
我的部分上下文看起来像:
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;
}
}
I left SetCommandTimeOutpublic so only the routines I need to take a long time (more than 5 minutes) I modify instead of a global timeout.
我离开了SetCommandTimeOut公众,所以我只修改了我需要花费很长时间(超过 5 分钟)的例程,而不是全局超时。
回答by Ronnie Overby
Same as other answers, but as an extension method:
与其他答案相同,但作为扩展方法:
static class Extensions
{
public static void SetCommandTimeout(this IObjectContextAdapter db, TimeSpan? timeout)
{
db.ObjectContext.CommandTimeout = timeout.HasValue ? (int?) timeout.Value.TotalSeconds : null;
}
}
回答by Timmerz
I extended Ronnie's answer with a fluent implementation so you can use it like so:
我用流畅的实现扩展了 Ronnie 的答案,因此您可以像这样使用它:
dm.Context.SetCommandTimeout(120).Database.SqlQuery...
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));
}
}
回答by Owen
In the generated constructor code it should call OnContextCreated()
在生成的构造函数代码中,它应该调用 OnContextCreated()
I added this partial class to solve the problem:
我添加了这个部分类来解决问题:
partial class MyContext: ObjectContext
{
partial void OnContextCreated()
{
this.CommandTimeout = 300;
}
}
回答by Vu Nguyen
You can use DbContext.Database.CommandTimeout = 180;
您可以使用 DbContext.Database.CommandTimeout = 180;
It's pretty simple and no cast required.
这非常简单,不需要演员表。
回答by Christian Gollhardt
For Database first Aproach:
对于数据库优先方法:
We can still set it in a constructor, by override the ContextName.Context.ttT4 Template this way:
我们仍然可以在构造函数中设置它,通过这种方式覆盖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;
<#
}
Database.CommandTimeout = 180;is the acutaly change.
Database.CommandTimeout = 180;是真正的变化。
The generated output is this:
生成的输出是这样的:
public ContextName() : base("name=ContextName")
{
Database.CommandTimeout = 180;
}
If you change your Database Model, this template stays, but the actualy class will be updated.
如果您更改数据库模型,此模板将保留,但实际类将被更新。
回答by Hassan Muhammad Saad
You can use this simple
:dbContext.Database.SetCommandTimeout(300);
你可以使用这个简单的:dbContext.Database.SetCommandTimeout(300);
回答by Andrew Burrow
I just ran in to this problem and resolved it by updating my application configuration file. For the connection in question, specify "Connection Timeout=60" (I am using entity framework version 5.0.0.0)
我刚刚遇到了这个问题,并通过更新我的应用程序配置文件解决了它。对于有问题的连接,请指定“Connection Timeout=60”(我使用的是实体框架版本 5.0.0.0)

