6

El uso de las Migraciones de Entity Framework (Beta1), utilizando el comando Update-Database funciona bien durante el desarrollo.Activación de la migración de EF al inicio de la aplicación mediante el código

Pero cuando la aplicación se ejecuta en algún servidor de algún cliente, realmente quiero que mi aplicación actualice automáticamente su esquema de base de datos a la última versión cuando se inicie.

¿Esto es posible? La documentación es escasa.

Respuesta

11

No proporcionan una forma de hacerlo hasta RTM, en ese punto se han prometido una aplicación de línea de comandos y un proveedor msdeploy. Fuente: http://blogs.msdn.com/b/adonet/archive/2011/11/29/code-first-migrations-beta-1-released.aspx

Por supuesto no estar satisfecho con eso, el comando de PowerShell se almacena en el directorio de paquetes y es texto sin formato, parece que simplemente carga una asamblea llamada EntityFramework.Migrations.Commands almacenados en el mismo directorio.

rastreo a través de ese montaje se me ocurrió la siguiente

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);    
    } 
} 

Actualización: Después de un poco de experimentación me di cuenta de algunas cosas más

  • realizar una actualización en el constructor estático para su el contexto es malo, ya que rompe los comandos de PowerShell, es mucho mejor agregar el código al inicio de la aplicación de otra manera (Global.asax, WebActivator o método principal)
  • El código anterior solo funciona cuando se usa AutomaticMi Por lo tanto, debe configurar MigrationsNamespace para que se remonte en las migraciones creadas manualmente.
  • La clase de configuración que estaba creando ya debería existir en su proyecto (se agregó cuando instaló el paquete nuget de migración), así que solo instale eso.

Lo que significa que el código se simplifica a

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

Tenga en cuenta que esto no está actualizado, el RTM de EF 4.3 contiene un nuevo inicializador de base de datos llamado MigrateDatabaseToLatestVersion. Consulte http://stackoverflow.com/questions/9281423/entity-framework-4-3-run-migrations-at-application-start para obtener más información. – Betty

+0

Aunque la configuración del inicializador en el contexto del constructor parece interferir con los scripts de powershell. He vuelto a usar un módulo app_start con el código anterior. – Betty

4

Otra de las opciones para este problema es añadir la línea

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

a su método de Global.asaxApplication_Start.

Cuestiones relacionadas