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 ?

130
demandé sur Tatranskymedved 2012-10-09 00:26:59

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>

Source: Comment: Définir la Chaîne de Connexion

169
répondu Leniel Maccaferri 2012-10-12 14:56:02

Vous pouvez utiliser DbContext.Database.CommandTimeout = 180;

C'est assez simple et aucun casting requis.

141
répondu Vu Nguyen 2017-08-18 03:17:13

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.

19
répondu Erik Philips 2012-10-08 20:34:56

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));
    } 
}
8
répondu Timmerz 2013-07-17 20:30:45

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;
    }
}
8
répondu Owen 2017-05-26 03:57:07

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;
    }
}
7
répondu Ronnie Overby 2013-05-08 13:01:25

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.

7
répondu Christian Gollhardt 2016-06-18 01:33:38