Utilizzo delle migrazioni di Entity Framework (prima del codice) in produzione

Sto solo cercando di utilizzare le migrazioni EF per il nostro progetto, e in particolare per l’esecuzione delle modifiche dello schema nella produzione tra le versioni.

Ho visto che esiste un’API per eseguire queste migrazioni in fase di esecuzione utilizzando la class DbMigration , ma non riesco a trovare alcun esempio specifico.

Idealmente, vorrei un file DbMigration per ogni modifica del database e che tali modifiche vengano applicate automaticamente all’avvio dell’applicazione dalla versione corrente fino alla versione più recente.

C’è un inizializzatore del database che puoi utilizzare per ottenere la migrazione all’ultima versione all’avvio (o meglio, il dbinitializer eseguirà il primo accesso db), MigrateDatabaseToLatestVersion , lo usi in questo modo:

 Database.SetInitializer( new MigrateDatabaseToLatestVersion()); 

Per quanto riguarda l’avere un file per migrazione, se abiliti le migrazioni automatiche le troverai nella cartella Migrations (di default) nella root del tuo progetto.

Informazioni rilevanti, con esempi, qui: http://weblogs.asp.net/fredriknormen/archive/2012/02/15/using-entity-framework-4-3-database-migration-for-any-project.aspx

Anche questo funziona:

 var configuration = new MyDbContextConfiguration(); configuration.TargetDatabase = new DbConnectionInfo( database.ConnectionString, database.ProviderName); var migrator = new DbMigrator(configuration); migrator.Update(); 

Puoi anche chiamare:

 migrator.GetPendingMigrations(); 

per ottenere un elenco delle migrazioni che deve applicare.

Dato che non hai specificato quale versione di Visual Studio stai usando, o Database, aggiungerò qui una risposta per dire che in VS2015 con Microsoft SQL Server, questo è incredibilmente facile da usare con lo strumento “Pubblica”.

Non devi preoccuparti dell’API di cui parli. È sufficiente eseguire il lavoro a livello locale, modificare i modelli, applicare le migrazioni, ecc. Quindi, quando si desidera distribuire / testare i server, utilizzare lo strumento di pubblicazione.

È ansible scegliere di applicare eventuali migrazioni effettuate localmente al server remoto la prima volta che viene avviata l’applicazione.

Una volta che hai tutte le tue migrazioni e tutto ciò che è stato fatto localmente (presumibilmente nel tuo Dev env), allora pubblichi (fai clic con il tasto destro del mouse sul progetto, fai clic su “Pubblica …” Seleziona la casella di controllo “Esegui il codice prima delle migrazioni all’avvio dell’applicazione” sotto la scheda “Impostazioni” e quindi applicherà le migrazioni la prima volta che si accede all’app (quindi ci sarà un breve ritardo la prima volta).

Pubblica Web utilizzando Web-Deploy

Guida: https://msdn.microsoft.com/en-us/library/dd465337(v=vs.110).aspx

Ho imparato tutto questo perché ho dovuto farlo su un server Windows 2012: http://www.sherweb.com/blog/how-to-install-webdeploy-on-windows-server-2012/

In bocca al lupo!

Volevo controllare quali migrazioni funzionassero esplicitamente nel codice e dopo un sacco di ricerche sono riuscito a sviluppare la seguente tecnica senza la necessità di una class DbConfiguration o di migrazioni automatiche abilitate:

 public static void RunMigration(this DbContext context, DbMigration migration) { var prop = migration.GetType().GetProperty("Operations", BindingFlags.NonPublic | BindingFlags.Instance); if (prop != null) { IEnumerable operations = prop.GetValue(migration) as IEnumerable; var generator = new SqlServerMigrationSqlGenerator(); var statements = generator.Generate(operations, "2008"); foreach (MigrationStatement item in statements) context.Database.ExecuteSqlCommand(item.Sql); } } 

E se avessimo una migrazione come questa:

 public class CreateIndexOnContactCodeMigration : DbMigration { public override void Up() { this.CreateIndex("Contacts", "Code"); } public override void Down() { base.Down(); this.DropIndex("Contacts", "Code"); } } 

Lo useremmo così:

 using (var dbCrm = new CrmDbContext(connectionString)) { var migration = new CreateIndexOnContactCodeMigration(); migration.Up(); dbCrm.RunMigration(migration); } 

Saluti.