Définir le délai d'expiration de la base de données dans Entity Framework
Ma commande garde le délai d'attente, donc j'ai besoin de changer la valeur de délai d'attente de commande par défaut.
J'ai trouvé myDb.Database.Connection.ConnectionTimeout
, mais readonly
.
Comment puis-je définir le délai d'attente de commande dans Entity Framework 5 ?
7 réponses
Essayez ceci sur votre contexte:
public class MyDatabase : DbContext
{
public MyDatabase ()
: base(ContextHelper.CreateConnection("Connection string"), true)
{
((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 180;
}
}
Si vous souhaitez définir le délai d'attente dans la chaîne de connexion, utilisez le Connection Timeout
comme paramètre dans la chaîne de connexion suivante:
<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>
Vous pouvez utiliser DbContext.Database.CommandTimeout = 180;
C'est assez simple et aucun casting requis.
Mon contexte partiel ressemble à:
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;
}
}
J'ai quitté SetCommandTimeOut
public, donc seules les routines dont j'ai besoin pour prendre beaucoup de temps (plus de 5 minutes) que je modifie au lieu d'un délai d'attente global.
J'ai étendu la réponse de Ronnie avec une implémentation fluide afin que vous puissiez l'utiliser comme ceci:
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));
}
}
Dans le code du constructeur généré, il doit appeler OnContextCreated()
J'ai ajouté cette classe partielle pour résoudre le problème:
partial class MyContext: ObjectContext
{
partial void OnContextCreated()
{
this.CommandTimeout = 300;
}
}
Identique aux autres réponses, mais en tant que méthode d'extension:
static class Extensions
{
public static void SetCommandTimeout(this IObjectContextAdapter db, TimeSpan? timeout)
{
db.ObjectContext.CommandTimeout = timeout.HasValue ? (int?) timeout.Value.TotalSeconds : null;
}
}
Pour la première approche de base de données:
Nous pouvons toujours le définir dans un constructeur, en remplaçant le ContextName.Context.tt modèle T4 de cette façon:
<#=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;
est le changement acutaly.
La sortie générée est la suivante:
public ContextName() : base("name=ContextName")
{
Database.CommandTimeout = 180;
}
Si vous modifiez votre modèle de base de données, Ce modèle reste, mais la classe actualy sera mise à jour.