Установить время ожидания базы данных в 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;
}
}
для базы данных first Aproach:
мы все еще можем установить его в конструкторе, переопределивContextName.Контекст.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;
это изменение acutaly.
сгенерированный вывод таков:
public ContextName() : base("name=ContextName")
{
Database.CommandTimeout = 180;
}
Если вы измените модель базы данных, этот шаблон останется, но класс actualy будет обновлен.