2016-08-09 7 views
0

すべての通常のコマンドに30秒のデフォルトタイムアウトを設定したいのですが、1つのストアドプロシージャでは5分必要です。Entity Frameworkでコマンドごとにコマンド固有のタイムアウトを指定する方法はありますか。

これが唯一の方法でない限り、私はこれをしたくありません。

public partial class AContext : DbContext 
{ 
    public AContext(string connectionString) 
     : base(connectionString) 
    { 
     ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 300; 
    } 
} 

どのようにこのクエリにタイムアウトを添付しますか?

Context.Database.SqlQuery<AAAAA>("usp_AAAAA"); 
+0

ストアドプロシージャを実行する前に変更し、完了後に元に戻します。 – techspider

答えて

1

あなたは、直接DbContextDatabase性質上DbContextからオブジェクトコンテキストを取得しようとする必要がCommandTimeoutを設定することはできません。

実行のためだけに新しいDbContextインスタンスを作成してから削除します。

DbContextインスタンスを共有している場合は、try/finallyブロックで呼び出しをラップし、最後にタイムアウトをリセットする必要があります。これは、失敗の場合でもタイムアウトがリセットされるようにするためです。

using(var Context = new AContext()) 
{ 
    Context.Database.CommandTimeout = 60*5; // 5 minutes 
    var result = Context.Database.SqlQuery<AAAAA>("usp_AAAAA"); 
} 

コンテキストが共有されている場合。

try 
{ 
    Context.Database.CommandTimeout = 60*5; // 5 minutes 
    var result = Context.Database.SqlQuery<AAAAA>("usp_AAAAA"); 
} 
finally{ 
    Context.Database.CommandTimeout = null; // reset 
} 
関連する問題