2016-03-03 19 views
5

Ho un'applicazione ASP.NET MVC. Quando viene creato un nuovo cliente tramite CustomerController Eseguo una nuova attività in background (utilizzando HostingEnvironment.QueueBackgroundWorkItem) per creare un nuovo Azure SqlDatabase per quel cliente.Inizializzazione database Entity Framework: timeout durante l'inizializzazione di Azure SqlDatabase

Uso il codice di Entity Framework First per creare/inizializzare il nuovo database. Ecco il codice:

// My ConnectionString 
var con = "..."; 

// Initialization strategy: create db and execute all Migrations 
// MyConfiguration is just a DbMigrationsConfiguration with AutomaticMigrationsEnabled = true 
Database.SetInitializer(strategy: new MigrateDatabaseToLatestVersion<CustomerDataContext, MyConfiguration>(useSuppliedContext: true)); 

using (var context = new CustomerDataContext(con)) 
{ 
    // Neither 'Connection Timeout=300' in ConnectionString nor this line helps -> TimeoutException will rise after 30-40s 
    context.Database.CommandTimeout = 300; 

    // create the db - this lines throws the exception after ~40s 
    context.Database.Initialize(true); 
} 

mio problema è che ho sempre trovato un TimeoutException dopo circa 40secs. Penso che ciò accada perché Azure non può inizializzare il nuovo database entro questo breve periodo di tempo. Non fraintendetemi: il database sarà creato bene da Azure ma voglio aspettare quel punto/sbarazzarmi dello TimeoutException.

Edit1: sto usando Timeout connessione = 300 nel mio ConnectionString, ma la mia app in realtà non si preoccupa che; dopo circa 40 anni mi imbatto sempre in un SqlError.

Edit2: L'eccezione che solleva è un SqlException. Messaggio: Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell'operazione o il server non risponde. Fonte: .NET SqlClient Data Provider

Edit3: posso confim ora che questo non ha nulla a che fare con ASP.NET/IIS. Anche in un semplice metodo UnitTest il codice sopra non riesce.

+0

Puoi condividere l'eccezione reale che si sta vedendo, con il messaggio di errore completo? Grazie! –

+0

Ho aggiunto l'eccezione. Grazie. – mmmato

+0

Esiste anche una proprietà CommandTimeout nella classe di configurazione delle migrazioni, puoi provare a impostarla. https://msdn.microsoft.com/en-us/library/system.data.entity.migrations.dbmigrationsconfiguration.commandtimeout(v=vs.113).aspx –

risposta

6

Sembra che ci sia un'altra impostazione CommandTimeout che è coinvolta nel processo di inizializzazione del database quando si utilizzano le migrazioni Code First. Voglio quindi condividere la mia soluzione qui nel caso in cui qualcuno incontri anche questo problema.

Grazie a Rowan Miller per il suo suggerimento che mi indica la soluzione.

Ecco il mio codice:

// Initialisation strategy 
Database.SetInitializer(strategy: new CreateDatabaseIfNotExists<MyDataContext>()); 

// Use DbContext 
using (var context = new MyDataContext(myConnectionString)) 
{ 
    // Setting the CommandTimeout here does not prevent the database 
    // initialization process from raising a TimeoutException when using 
    // Code First Migrations so I think it's not needed here. 
    //context.Database.CommandTimeout = 300; 

    // this will create the database if it does not exist 
    context.Database.Initialize(force: false); 
} 

E la mia classe Configuration.cs:

public sealed class Configuration : DbMigrationsConfiguration<MyDataContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     AutomaticMigrationDataLossAllowed = false; 

     // Very important! Gives me enough time to wait for Azure 
     // to initialize (Create -> Migrate -> Seed) the database. 
     // Usually Azure needs 1-2 minutes so the default value of 
     // 30 seconds is not big enough! 
     CommandTimeout = 300; 
    } 
} 
1

Il timeout del comando e il timeout della connessione sono due impostazioni diverse. In questo caso si aumenta solo il comando timeout. È possibile aumentare il timeout della connessione in web.config: Connection Timeout=120. L'unica volta che si desidera aumentare il timeout della connessione è quando si crea il database.

+0

Grazie per il tuo suggerimento ma purtroppo questo non cambia nulla. My ConnectionString sta già utilizzando Connection Timeout: Server = XXX.database.windows.net; Database = DB_Customer_34; ID utente = XXX; Password = XXX; Timeout connessione = 240; MultipleActiveResultSets = True; Encrypt = True; App = EntityFramework – mmmato

Problemi correlati