コマンドがタイムアウトし続けるので、デフォルトのコマンドタイムアウト値を変更する必要があります。
見つけましたがmyDb.Database.Connection.ConnectionTimeout
、readonly
です。
Entity Framework 5でコマンドタイムアウトを設定するにはどうすればよいですか?
コマンドがタイムアウトし続けるので、デフォルトのコマンドタイムアウト値を変更する必要があります。
見つけましたが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
とてもシンプルで、キャストは必要ありません。
私の部分的なコンテキストは次のようになります。
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をそのコンストラクターで読み取らせる必要があります。
この用語をweb.config接続文字列に追加します。ConnectionTimeout=300;
コンストラクターに次のコードを追加します。
Database.CommandTimeout = Database.Connection.ConnectionTimeout;
このアプローチにより、ユーザーは新しい公開を行わずにタイムアウトを制御できるようになります。