180 votes

Définir la base de données timeout dans le Cadre de l'Entité

Mon programme de garde d'expirer. j'ai donc besoin de modifier la valeur par défaut délai d'expiration de connexion de la valeur. J'ai trouvé cette myDb.Database.Connection.ConnectionTimeout , mais elle est en lecture seule.

Comment puis-je définir le délai d'attente de la base de données dans l'Entity Framework 5?

218voto

Leniel Macaferi Points 38324

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 l' 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

201voto

Vu Nguyen Points 332

Cette question est posée pour EF5, mais pour Entity Framework 6, vous pouvez utiliser DbContext.Database.CommandTimeout = 180;

Il est assez simple et pas de cast requis.

21voto

Erik Philips Points 18156

Mon partiel contexte 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 du public de sorte que seules les routines j'ai besoin de prendre un long moment (plus de 5 minutes) j'ai modifier au lieu d'un délai global.

9voto

Timmerz Points 1235

J'ai étendu Ronnie réponse avec un fluide de mise en œuvre de sorte que vous pouvez 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));
    } 
}

8voto

Ronnie Overby Points 11402

Comme pour les autres réponses, mais comme une extension de la méthode:

static class Extensions
{
    public static void SetCommandTimeout(this IObjectContextAdapter db, TimeSpan? timeout)
    {
        db.ObjectContext.CommandTimeout = timeout.HasValue ? (int?) timeout.Value.TotalSeconds : null;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X