1. ホーム
  2. c#

[解決済み] エンティティフレームワークのタイムアウト

2022-02-19 16:31:18

質問

Entity Framework(EF)で、関数のインポートを使用すると、30秒以上かかるタイムアウトが発生します。以下を試してみましたが、この問題を解決することができません。

私は Default Command Timeout=300000 の接続文字列に App.Config EDMX ファイルを持つプロジェクトで、次のように提案されています。 ここで .

私の接続文字列はこんな感じです。

<add 
    name="MyEntityConnectionString" 
    connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|
       res://*/MyEntities.msl;
       provider=System.Data.SqlClient;provider connection string=&quot;
       Data Source=trekdevbox;Initial Catalog=StarTrekDatabase;
       Persist Security Info=True;User ID=JamesTKirk;Password=IsFriendsWithSpock;
       MultipleActiveResultSets=True;Default Command Timeout=300000;&quot;"
    providerName="System.Data.EntityClient" />

こんな感じで、リポジトリに直接CommandTimeoutを設定してみました。

private TrekEntities context = new TrekEntities();

public IEnumerable<TrekMatches> GetKirksFriends()
{
    this.context.CommandTimeout = 180;
    return this.context.GetKirksFriends();
}

EFがタイムアウトしないようにするには、他にどうしたらよいですか?この現象は非常に大きなデータセットに対してのみ発生します。小さなデータセットではすべてうまくいきます。

以下は、私が受け取ったエラーの一つです。

System.Data.EntityCommandExecutionException: コマンド定義の実行中にエラーが発生しました。詳細は内部例外を参照してください。---> System.Data.SqlClient.SqlException: タイムアウトが切れました。 操作の完了前にタイムアウト時間が経過したか、サーバーが応答していません。


OK - 私はこれを動作させることができましたが、何が起こったのか愚かです。私は、接続文字列を Default Command Timeout=300000 とCommandTimeoutを180に設定しました。を削除したところ Default Command Timeout を接続文字列から削除すると、動作しました。つまり、リポジトリ内のコンテキストオブジェクトに手動でCommandTimeoutを設定すればいいということです。

this.context.CommandTimeout = 180;

接続文字列でタイムアウトの設定をしても、何の影響もないらしい。

解決方法は?

EFの接続文字列でデフォルトコマンドタイムアウトを指定すると、既知のバグがあります。

http://bugs.mysql.com/bug.php?id=56806

接続文字列から値を削除し、データコンテキストオブジェクト自体に値を設定します。これは、コネクションストリングから競合する値を削除すれば動作します。

Entity Framework Core 1.0:

this.context.Database.SetCommandTimeout(180);

Entity Framework 6:

this.context.Database.CommandTimeout = 180;

Entity Framework 5:

((IObjectContextAdapter)this.context).ObjectContext.CommandTimeout = 180;

Entity Framework 4以下。

this.context.CommandTimeout = 180;