完了までに 30 秒以上かかる関数のインポートを使用すると、Entity Framework (EF) でタイムアウトが発生します。次のことを試しましたが、この問題を解決できませんでした。
提案されたようにEDMXファイルを持つプロジェクトのApp.ConfigDefault Command Timeout=300000
ファイルに接続文字列を追加しましたここ。
接続文字列は次のようになります。
<add
name="MyEntityConnectionString"
connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|
res://*/MyEntities.msl;
provider=System.Data.SqlClient;provider connection string="
Data Source=trekdevbox;Initial Catalog=StarTrekDatabase;
Persist Security Info=True;User ID=JamesTKirk;Password=IsFriendsWithSpock;
MultipleActiveResultSets=True;Default Command Timeout=300000;""
providerName="System.Data.EntityClient" />
次のようにリポジトリで CommandTimeout を直接設定してみました。
private TrekEntities context = new TrekEntities();
public IEnumerable<TrekMatches> GetKirksFriends()
{
this.context.CommandTimeout = 180;
return this.context.GetKirksFriends();
}
EF がタイムアウトしないようにするには、他に何ができますか? これは、非常に大きなデータセットでのみ発生します。小さなデータセットではすべて正常に動作します。
私が受け取ったエラーの 1 つを以下に示します。
System.Data.EntityCommandExecutionException: コマンド定義の実行中にエラーが発生しました。詳細については、内部例外を参照してください。 ---> System.Data.SqlClient.SqlException: タイムアウトが経過しました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。
OK - これでうまくいきました。起こったことはおかしなことです。接続文字列に がありDefault Command Timeout=300000
、CommandTimeout が 180 に設定されていましたDefault Command Timeout
。接続文字列から を削除すると、うまくいきました。したがって、答えは、リポジトリのコンテキスト オブジェクトで CommandTimeout を次のように手動で設定することです。
this.context.CommandTimeout = 180;
どうやら、接続文字列でタイムアウト設定を設定しても効果はないようです。
ベストアンサー1
EF 接続文字列内でデフォルトのコマンド タイムアウトを指定すると、既知のバグが発生します。
接続文字列から値を削除し、データ コンテキスト オブジェクト自体に設定します。これは、競合する値を接続文字列から削除すると機能します。
エンティティ フレームワーク コア 1.0:
this.context.Database.SetCommandTimeout(180);
エンティティフレームワーク6:
this.context.Database.CommandTimeout = 180;
エンティティフレームワーク5:
((IObjectContextAdapter)this.context).ObjectContext.CommandTimeout = 180;
Entity Framework 4 以下:
this.context.CommandTimeout = 180;