2013-03-22 15 views
6

Ho impostato una semplice migrazione con AutomaticMigrationsEnabled = false. Tutto funziona alla grande da Visual Studio o quando si utilizza MigrateDatabaseToLatestVersion.Entity Framework Migrations - Il seed viene eseguito anche se non vi sono migrazioni?

Tuttavia, questo non è l'ideale per me. Vorrei eseguire migrazioni da uno script di distribuzione sul mio server ci. Ho trovato this article che spiega come fare questo usando migrate.exe ma questo sembra a sempre il esegue il seme. Questo è anche quando non ci sono migrazioni da applicare.

Devo controllare a livello di codice nel metodo Seed se sono state eseguite migrazioni? Come faccio a fare questo?

+0

Perché non rendere il seme idempotente? –

+0

@LukeMcGregor - Se voglio inserire alcuni dati, come faccio a farlo senza chiavi esplicitamente codificanti o eseguendo controlli scritti personalizzati su ogni tabella per fastidi? –

+1

personalmente ho chiavi hard-code per i dati seme, dato il suo seme è statico comunque IMO –

risposta

5

Utilizzare DbMigrator per eseguire manualmente Update() solo se sono presenti migrazioni in sospeso. È stato introdotto in Entity Framework 5.0.

private void MigrateAndSeedDbIfSchemaIsOutdated() 
{ 
    // Disable initializer. 
    Database.SetInitializer<MyContext>(null); 

    // Make sure database exists. 
    using (var db = new MyContext()) 
    { 
     db.Database.Initialize(false); 
    } 

    var migrator = new DbMigrator(new MyConfiguration()); 

    if (migrator.GetPendingMigrations().Any()) 
    { 
     // Run migrations and seed. 
     migrator.Update(); 
    } 
} 
+0

Ah, non conoscevo quel metodo grazie! Una nota sul LINQ: non è necessario richiamare 'ToList' qui, puoi semplicemente lasciare PendingMigrations come un' IEnumerable <> 'e chiamare' .Any() '. Chiamando 'ToList' impone l'intera enumerazione per valutare mentre ti interessa solo se c'è almeno un elemento in esso. –

+0

Hai ragione, ho usato quella parte per il debug. Ho modificato la risposta. – angularsen

Problemi correlati