在Entity Framework中设置数据库超时

Jam*_*mes 158 c# asp.net-mvc entity-framework connection-timeout .net-4.5

我的命令保持超时,所以我需要更改默认命令超时值.

我发现了myDb.Database.Connection.ConnectionTimeout,但它确实如此readonly.

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

Len*_*rri 192

在您的上下文中尝试这个:

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

如果要在连接字符串中定义超时,请使用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>
Run Code Online (Sandbox Code Playgroud)

来源:如何:定义连接字符串

  • 连接超时和CommandTimeout以及两个单独的东西.连接字符串设置"连接超时"不会影响命令运行的时间(CommandTimeout). (125认同)
  • 我的问题很不一样.我在迁移期间遇到了超时.EF具有与在迁移期间设置的类似属性:http://msdn.microsoft.com/en-us/library/system.data.entity.migrations.dbmigrationsconfiguration.commandtimeout (3认同)
  • 根据您使用的EF版本,请参阅[此答案](http://stackoverflow.com/a/6234593/2874896)以了解有关如何指定CommandTimeout属性的不同API. (2认同)

Vu *_*yen 171

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

它非常简单,无需演员表.

  • 对于我们使用“Fluent API”形式的 EF 非常有用。 (2认同)

Eri*_*ips 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我离开SetCommandTimeOut公众所以我只需要花费很长时间(超过5分钟)我需要修改的例程而不是全局超时.


Owe*_*wen 9

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

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

partial class MyContext: ObjectContext
{
    partial void OnContextCreated()
    {
        this.CommandTimeout = 300;
    }
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*erz 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));
    } 
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*rdt 8

对于数据库第一个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;
<#
}
Run Code Online (Sandbox Code Playgroud)

Database.CommandTimeout = 180; 是真正的改变.

生成的输出是这样的:

public ContextName() : base("name=ContextName")
{
    Database.CommandTimeout = 180;
}
Run Code Online (Sandbox Code Playgroud)

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


Ron*_*rby 7

与其他答案相同,但作为扩展方法:

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