在实体框架设置数据库超时(Set database timeout in Entity Framew

2019-06-18 10:56发布

我的命令不断超时,所以我需要更改默认的命令超时值。

我发现myDb.Database.Connection.ConnectionTimeout ,但它是readonly

我如何可以设置实体框架5命令超时?

Answer 1:

试试这个在您的上下文:

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>

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



Answer 2:

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

这是非常简单,不需要造型。



Answer 3:

我的部分上下文的样子:

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分钟以上),我修改,而不是全局超时例程。



Answer 4:

我伸出罗尼的回答与流畅实现,所以你可以使用它像这样:

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));
    } 
}


Answer 5:

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

我加入这个局部类来解决这个问题:

partial class MyContext: ObjectContext
{
    partial void OnContextCreated()
    {
        this.CommandTimeout = 300;
    }
}


Answer 6:

同其他的答案,但作为一个扩展的方法:

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


Answer 7:

对于数据库第一阿布罗奇:

我们仍然可以将其设置在构造函数中,通过覆盖在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; 是acutaly变化。

所产生的输出是这样的:

public ContextName() : base("name=ContextName")
{
    Database.CommandTimeout = 180;
}

如果你改变你的数据库模型,这个模板保持,但actualy类将被更新。



文章来源: Set database timeout in Entity Framework