Установка времени ожидания базы данных в Entity Framework
моя команда продолжает тайм-аут, поэтому мне нужно изменить значение тайм-аута команды по умолчанию.
Я нашел myDb.Database.Connection.ConnectionTimeout
, но это readonly
.
как я могу установить тайм-аут команды в Entity Framework 5 ?
7 ответов:
попробуйте это на ваших условиях:
public class MyDatabase : DbContext { public MyDatabase () : base(ContextHelper.CreateConnection("Connection string"), true) { ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 180; } }
Если вы хотите определить параметр timeout в строке подключения, используйте
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;
Это довольно просто и не требуется бросок.
мой частичный контекст выглядит так:
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
public поэтому только процедуры, которые мне нужно занять много времени (более 5 минут), я изменяю вместо глобального таймаута.
я расширил ответ Ронни с беглой реализацией, чтобы вы могли использовать его так:
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)); } }
в сгенерированном коде конструктора он должен вызвать
OnContextCreated()
я добавил этот частичный класс для решения проблемы:
partial class MyContext: ObjectContext { partial void OnContextCreated() { this.CommandTimeout = 300; } }
Так же, как и другие ответы, но в качестве метода расширения:
static class Extensions { public static void SetCommandTimeout(this IObjectContextAdapter db, TimeSpan? timeout) { db.ObjectContext.CommandTimeout = timeout.HasValue ? (int?) timeout.Value.TotalSeconds : null; } }
для базы данных первого подхода:
мы все еще можем установить его в конструкторе, переопределив 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; }
Если вы измените модель базы данных, этот шаблон останется, но класс actualy будет обновлен.