176

コマンドがタイムアウトし続けるので、デフォルトのコマンドタイムアウト値を変更する必要があります。

見つけましたがmyDb.Database.Connection.ConnectionTimeoutreadonlyです。

Entity Framework 5でコマンドタイムアウトを設定するにはどうすればよいですか?

4

10 に答える 10

213

あなたの文脈でこれを試してください:

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>

出典:方法:接続文字列を定義する

于 2012-10-08T20:29:22.913 に答える
195

使用できますDbContext.Database.CommandTimeout = 180; // seconds

とてもシンプルで、キャストは必要ありません。

于 2014-05-21T01:35:38.923 に答える
21

私の部分的なコンテキストは次のようになります。

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分以上)かかる必要があるルーチンのみを変更します。

于 2012-10-08T20:34:56.563 に答える
10

生成されたコンストラクタコードでは、OnContextCreated()

問題を解決するために、この部分クラスを追加しました。

partial class MyContext: ObjectContext
{
    partial void OnContextCreated()
    {
        this.CommandTimeout = 300;
    }
}
于 2014-03-25T10:46:58.127 に答える
9

私は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));
    } 
}
于 2013-07-17T20:30:45.880 に答える
9

データベースの最初のアプローチの場合:

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

データベースモデルを変更した場合、このテンプレートは残りますが、実際のクラスは更新されます。

于 2016-06-18T01:33:38.127 に答える
8

他の回答と同じですが、拡張メソッドとして:

static class Extensions
{
    public static void SetCommandTimeout(this IObjectContextAdapter db, TimeSpan? timeout)
    {
        db.ObjectContext.CommandTimeout = timeout.HasValue ? (int?) timeout.Value.TotalSeconds : null;
    }
}
于 2013-05-08T13:01:25.630 に答える
1

あなたはこれを簡単に使うことができます:
dbContext.Database.SetCommandTimeout(300);

于 2019-12-03T09:53:07.460 に答える
1

この問題に遭遇し、アプリケーション構成ファイルを更新することで問題を解決しました。問題の接続には、「Connection Timeout = 60」を指定します(エンティティフレームワークバージョン5.0.0.0を使用しています)

ConnectionTimeout設定

于 2020-04-24T16:37:16.210 に答える
-2

Web構成の接続文字列タグに変更を加え、EntityFrameWorkをそのコンストラクターで読み取らせる必要があります。

  1. この用語をweb.config接続文字列に追加します。ConnectionTimeout=300;

  2. コンストラクターに次のコードを追加します。

    Database.CommandTimeout = Database.Connection.ConnectionTimeout;

このアプローチにより、ユーザーは新しい公開を行わずにタイムアウトを制御できるようになります。

于 2021-04-02T08:41:11.763 に答える