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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 00:28:43  来源:igfitidea点击:

Set database timeout in Entity Framework

c#asp.net-mvcentity-framework.net-4.5connection-timeout

提问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)

ConnectionTimeout Setting

连接超时设置