簡體   English   中英

在實體框架中設置數據庫超時

[英]Set database timeout in Entity Framework

我的命令一直超時,所以我需要更改默認的命令超時值。

我找到了myDb.Database.Connection.ConnectionTimeout ,但它是readonly

如何在Entity Framework 5 中設置命令超時?

在您的上下文中嘗試此操作:

public class MyDatabase : DbContext
{
    public MyDatabase ()
        : base(ContextHelper.CreateConnection("Connection string"), true)
    {
        ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 180; // seconds
    }
}

如果要在連接字符串中定義超時,請使用如下連接字符串中的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>

來源:如何:定義連接字符串

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

這非常簡單,不需要演員表。

我的部分上下文看起來像:

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 分鍾)的例程,而不是全局超時。

在生成的構造函數代碼中,它應該調用OnContextCreated()

我添加了這個部分類來解決問題:

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

我用流暢的實現擴展了 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));
    } 
}

對於數據庫優先方法:

我們仍然可以在構造函數中設置它,通過這種方式覆蓋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;
}

如果您更改數據庫模型,此模板將保留,但實際類將被更新。

與其他答案相同,但作為擴展方法:

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

你可以使用這個簡單的:
dbContext.Database.SetCommandTimeout(300);

我剛剛遇到了這個問題,並通過更新我的應用程序配置文件解決了它。 對於有問題的連接,請指定“Connection Timeout=60”(我使用的是實體框架版本 5.0.0.0)

連接超時設置

您應該在 Web 配置中的連接字符串標記中進行更改,並在其構造函數中讀取 EntityFrameWork。

  1. 將此術語添加到 web.config 連接字符串:Connection Timeout=300;

  2. 在構造函數中添加以下代碼:

    Database.CommandTimeout = Database.Connection.ConnectionTimeout;

通過這種方法,您將使用戶能夠控制超時,而無需為他進行新的發布。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM