risposta

50

Il modo migliore dovrebbe essere l'utilizzo del nuovo inizializzatore MigrateDatabaseToLatestVersion.

Database.SetInitializer<YourContext>(
    new MigrateDatabaseToLatestVersion<YourContext, YourMigrationsConfig>()); 
Database.Initialize(false); 
+4

Dove è destinato questo codice? Non è possibile utilizzare Database.Initialize in App_Start poiché non può essere utilizzato in un contesto statico. –

+0

@ MaximV.Pavlov: prova ad aggiungerlo al costruttore statico del tuo contesto. –

+0

@LadislavMrnka: qual è lo scopo di 'Database.Initialize (false);'? Dai miei test con 'MigrateDatabaseToLatestVersion', il database viene creato, seminato e aggiornato alla versione più recente senza quella seconda chiamata di inizializzazione. (in EF5 ...) – demoncodemonkey

6

Un grande descrizione delle opzioni di configurazione EF 4.3 può essere trovato alla EF 4.3 Configuration File Settings sul blog del team di ADO.NET. L'ultima sezione descrive Initializer Database, incluso il nuovo inizializzatore Code First MigrateDatabaseToLatestVersion.

Anche se Entity Framework-come tante altre funzionalità di .NET 4.x-favori convenzione sulla configurazione, questo è un caso in cui potrebbe essere molto utile per impostare l'inizializzazione MigrateDatabaseToLatestVersion database tramite file di configurazione dell'applicazione, piuttosto che in modo esplicito codice nella tua applicazione.

+0

Quando si utilizza la configurazione, prendere nota del mio commento su quel post per rendere la configurazione molto più leggibile. – Rudi

4

Avevo bisogno di farlo esplicitamente, perché io uso un uber-context per la migrazione, un superset delle altre migrazioni. Il bit chiave è:

var dbMigrator = new System.Data.Entity.Migrations.DbMigrator(
    new Lcmp.EF.Migrations.Migrations.Configuration()); 
dbMigrator.Update(); 

con una spolverata di registrazione Elmah, io in realtà uso questo, chiamato da Application_Start(). Pezzi di esso sono rubati dalle idee altrui. Non sono sicuro che la parte interbloccata di sicurezza del filo sia necessaria.

public static int IsMigrating = 0; 
private static void UpdateDatabase() 
{ 
    try 
    { 
     if (0 == System.Threading.Interlocked.Exchange(ref IsMigrating, 1)) 
     { 
      try 
      { 
       // Automatically migrate database to catch up. 
       Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("Checking db for pending migrations."))); 
       var dbMigrator = new System.Data.Entity.Migrations.DbMigrator(new Lcmp.EF.Migrations.Migrations.Configuration()); 
       var pendingMigrations = string.Join(", ", dbMigrator.GetPendingMigrations().ToArray()); 
       Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("The database needs these code updates: " + pendingMigrations))); 
       dbMigrator.Update(); 
       Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("Done upgrading database."))); 
      } 
      finally 
      { 
       System.Threading.Interlocked.Exchange(ref IsMigrating, 0); 
      } 
     } 
    } 
    catch (System.Data.Entity.Migrations.Infrastructure.AutomaticDataLossException ex) 
    { 
     Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(ex)); 
    } 
    catch (Exception ex) 
    { 
     Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(ex)); 
    } 
} 
Problemi correlati