6

Utilizzo di Entity Framework Migrations (Beta1), utilizzando il comando Update-Database è tutto valido durante lo sviluppo.Attivazione della migrazione EF all'avvio dell'applicazione tramite il codice

Ma quando l'applicazione è in esecuzione su qualche server del cliente da qualche parte, voglio davvero che la mia applicazione aggiorni automaticamente lo schema del database alla versione più recente quando viene avviata.

È possibile? La documentazione è scarsa

risposta

11

Non forniscono un modo per eseguire questa operazione fino a quando RTM, a quel punto, hanno promesso un'app della riga di comando e un provider msdeploy. Fonte: http://blogs.msdn.com/b/adonet/archive/2011/11/29/code-first-migrations-beta-1-released.aspx

Naturalmente non accontentarsi di questo, il comando di PowerShell viene memorizzato nella directory dei pacchetti ed è testo semplice, sembra di caricare solo compongono un insieme chiamato EntityFramework.Migrations.Commands memorizzati nella stessa directory.

Tracciare attraverso quell'assemblea mi si avvicinò con la seguente

public class MyContext : DbContext 
{ 
    static MyContext() 
    { 
    DbMigrationsConfiguration configuration = new DbMigrationsConfiguration() { 
     MigrationsAssembly = typeof(MyContext).Assembly, 
     ContextType = typeof(MyContext), 
     AutomaticMigrationsEnabled = true,     
    }; 

    DbMigrator dbMigrator = new DbMigrator(configuration);   
    dbMigrator.Update(null);    
    } 
} 

AGGIORNAMENTO: dopo un po 'di sperimentazione ho capito un paio di cose

  • eseguire un aggiornamento nel costruttore statico per il il contesto è negativo poiché interrompe i comandi di PowerShell, molto meglio aggiungendo il codice all'avvio dell'applicazione in un altro modo (Global.asax, WebActivator o Metodo principale)
  • Il codice sopra riportato funziona solo quando si utilizza AutomaticMi grations, è necessario impostare lo spazio MigrationsNames per il ritiro sulle migrazioni create manualmente
  • La classe di configurazione che stavo creando dovrebbe già esistere nel progetto (aggiunta quando si installa il pacchetto di migrazione nuget), quindi basta istanziare quella invece.

Il che significa che il codice è semplificato a

DbMigrator dbMigrator = new DbMigrator(new NAMESPACE.TO.MIGRATIONS.Configuration()); 
dbMigrator.Update(null);   
+3

Si noti che questo è ormai obsoleto, l'RTM di EF 4.3 contiene un nuovo inizializzatore del database denominato MigrateDatabaseToLatestVersion. Vedi http://stackoverflow.com/questions/9281423/entity-framework-4-3-run-migrations-at-application-start per maggiori informazioni. – Betty

+0

Sebbene l'impostazione dell'inizializzatore nel costruttore di contesto sembra interferire con gli script di PowerShell. Sono tornato a utilizzare un modulo app_start con il codice precedente. – Betty

4

Un'altra possibilità per questo problema è quello di aggiungere la linea

Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, NAMESPACE.TO.MIGRATIONS.Configuration>()); 

al metodo Global.asaxApplication_Start.

Problemi correlati