2013-08-23 11 views
9

Vorrei impostare ConnectionTimeout su un valore diverso da quello predefinito, che è 15 secondi. Ho ereditato un po 'di codice che utilizza EntityFramework e app.config appare così:Impostazione ConnectionTimeout quando si utilizza EntityFramework

<configuration> 
    <configSections> 
     <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxx" requirePermission="false" /> 
</configSections> 
<connectionStrings> 
<add name="DefaultConnection" connectionString="Data Source=.\SQLEXPRESS; Integrated Security=True; ConnectionTimeout=30; MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> 
</connectionStrings> 
<entityFramework> 
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"> 
    <parameters> 
    <parameter value="Data Source=.\SQLEXPRESS; Integrated Security=True; ConnectionTimeout=30; MultipleActiveResultSets=True" /> 
    </parameters> 
</defaultConnectionFactory> 
</entityFramework> 

Sono io quello che ha aggiunto il sectino nel tentativo di far funzionare le cose. Posso dire che non funziona impostando un breakpoint su:

var adapter = (IObjectContextAdapter) this; 
var objectContext = adapter.ObjectContext; 
objectContext.CommandTimeout = CommandTimeoutSeconds; 
int test = objectContext.Connection.ConnectionTimeout; 

test è sempre 15. Che sta succedendo? Qualcuno può dirmi come impostare ConnectionTimeout? Ho provato sia "ConnectionTimeout" che "Connection Timeout" I.e. senza spazio contro spazio.

Qualcuno può aiutarmi? Mi sto tirando i capelli. Sono sicuro che è una soluzione semplice! Dave

Ulteriori informazioni. In risposta al commento, ecco la mia DbContext classe derivata ...

public class SessionDataContext : DbContext 
{ 
    // Command timeout (seconds) 
    private const int CommandTimeoutSeconds = 30; 

    /// <summary> 
    /// Constructor that takes db name. 
    /// The connection string and db itself is configured in the this project's app.config file 
    /// </summary> 
    /// <param name="dbName"></param> 
    public SessionDataContext(string dbName) : base(dbName) 
    { 
     Database.SetInitializer(new SessionDataContextInitializer()); 

     // Set timeout (based on code from http://stackoverflow.com/questions/6232633/entity-framework-timeouts) 
     var adapter = (IObjectContextAdapter) this; 
     var objectContext = adapter.ObjectContext; 
     objectContext.CommandTimeout = CommandTimeoutSeconds; 
     int test = objectContext.Connection.ConnectionTimeout; 
    } 

    /// <summary> 
    /// Session table's records 
    /// </summary> 
    public DbSet<Session> Sessions { get; set; } 

    /// <summary> 
    /// SessionType table's records 
    /// </summary> 
    public DbSet<SessionType> SessionTypes { get; set; } 
} 
+0

come si crea la classe derivata DbContext? Stai passando il nome della stringa di connessione lì? – Pawel

+0

Ciao Pawel, ho inserito la classe drivata DbContext nella domanda. Grazie per aver guardato la mia domanda. – Dave

+0

Hai dato un'occhiata a http://stackoverflow.com/questions/6232633/entity-framework-timeouts? –

risposta

7

Era stupidità da parte mia che stava causando il problema! Ho messo la mia risposta qui nel caso in cui qualcuno in futuro abbia questo problema. Tutto ciò che ho digitato sopra è corretto e funzionerà correttamente. Tuttavia, il file app.config che stavo osservando era in una libreria di classi (il nostro livello DataAccess). In effetti, non veniva utilizzato affatto e venivano utilizzate le impostazioni di EntityFramework predefinite. Sono sicuro di ciò che mi ha spinto a provarlo, ma ho spostato le impostazioni di app.config dal livello DataAccess app.config all'app principale.config e tutto ha funzionato magnificamente. A proposito di tutto quello che posso dire a mia difesa, a parte il fatto che ho ereditato il codice, è che non mi è chiaro vedere che i valori in app.config non vengono utilizzati e uno non li chiama o li usa nel proprio codice. Piuttosto, MultipleActiveResultSets e ConnectionTimeout sono utilizzati dal Entity Framework sottostante.

Problemi correlati