c# - datos - entity framework database first español
Establecer el tiempo de espera de la base de datos en Entity Framework (7)
Mi comando mantiene el tiempo de espera, por lo que necesito cambiar el valor predeterminado de tiempo de espera del comando.
Encontré myDb.Database.Connection.ConnectionTimeout
, pero es de readonly
.
¿Cómo puedo establecer el tiempo de espera del comando en Entity Framework 5 ?
En el código de constructor generado debe llamar a OnContextCreated()
Agregué esta clase parcial para resolver el problema:
partial class MyContext: ObjectContext
{
partial void OnContextCreated()
{
this.CommandTimeout = 300;
}
}
Extendí la respuesta de Ronnie con una implementación fluida para que pueda usarla así:
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));
}
}
Igual que otras respuestas, pero como un método de extensión:
static class Extensions
{
public static void SetCommandTimeout(this IObjectContextAdapter db, TimeSpan? timeout)
{
db.ObjectContext.CommandTimeout = timeout.HasValue ? (int?) timeout.Value.TotalSeconds : null;
}
}
Mi contexto parcial se ve así:
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;
}
}
Dejé SetCommandTimeOut
público, por lo que solo SetCommandTimeOut
las rutinas que necesito tomar (más de 5 minutos) en lugar de un tiempo de espera global.
Para el primer acercamiento de la base de datos:
Todavía podemos configurarlo en un constructor, anulando la plantilla ContextName.Context.tt T4 de esta manera:
<#=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;
es el cambio acutaly.
El resultado generado es este:
public ContextName() : base("name=ContextName")
{
Database.CommandTimeout = 180;
}
Si cambia su Modelo de base de datos, esta plantilla permanece, pero la clase actual se actualizará.
Prueba esto en tu contexto:
public class MyDatabase : DbContext
{
public MyDatabase ()
: base(ContextHelper.CreateConnection("Connection string"), true)
{
((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 180;
}
}
Si desea definir el tiempo de espera en la cadena de conexión, use el parámetro Connection Timeout
como en la siguiente cadena de conexión:
<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>
Puede usar DbContext.Database.CommandTimeout = 180;
Es bastante simple y no requiere molde.