Uso de Entity Framework (código primero) migraciones en producción

Solo busco usar migraciones de EF para nuestro proyecto, y en particular para realizar cambios de esquema en la producción entre lanzamientos.

He visto mencionar que hay una API para realizar estas migraciones en tiempo de ejecución utilizando la clase DbMigration , pero no puedo encontrar ningún ejemplo específico.

Idealmente, quisiera un archivo de DbMigration para cada cambio de base de datos, y para que esos cambios se apliquen automáticamente en el inicio de la aplicación desde la versión actual hasta la última versión.

Hay un inicializador de base de datos que puede usar para lograr la migración a la última versión en el inicio (o mejor, el dbinitializer se activará en el primer acceso de base de datos), la base de datos MigrateDatabaseToLatestVersion , la usa así:

 Database.SetInitializer( new MigrateDatabaseToLatestVersion()); 

En cuanto a tener un archivo por migración, si habilita las migraciones automáticas, las encontrará en la carpeta Migrations (de forma predeterminada) en la raíz de su proyecto.

Información relevante, con ejemplos, aquí: http://weblogs.asp.net/fredriknormen/archive/2012/02/15/using-entity-framework-4-3-database-migration-for-any-project.aspx

Esto también funciona:

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

También puedes llamar:

 migrator.GetPendingMigrations(); 

para obtener una lista de las migraciones que necesita aplicar.

Como no especificó la versión de Visual Studio que está utilizando, o la base de datos, agregaré una respuesta aquí para decir eso en VS2015 con SQL Server de Microsoft, ahora es increíblemente fácil usar la herramienta “Publicar”.

No necesita molestarse con la API de la que habla. Simplemente haga su trabajo localmente, cambie sus modelos, aplique migraciones, etc., y luego, cuando desee lanzarlos para lanzar / probar servidores, use la herramienta de publicación.

Puede seleccionar aplicar las migraciones que haya realizado localmente al servidor remoto la primera vez que se inicia la aplicación.

Una vez que haya realizado todas sus migraciones y todo de forma local (presumiblemente en su entorno de desarrollo), publique (haga clic derecho en el proyecto, haga clic en “Publicar …” Marque la casilla “Ejecutar código primeras migraciones (se ejecuta al iniciar la aplicación)” en la pestaña “Configuración” y luego aplicará las migraciones la primera vez que se acceda a la aplicación (por lo que habrá un breve retraso la primera vez).

Publicar web usando Web-Deploy

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

Aprendí todo esto porque tenía que hacer esto en un servidor de Windows 2012: http://www.sherweb.com/blog/how-to-install-webdeploy-on-windows-server-2012/

¡Buena suerte!

Quería controlar qué migraciones se ejecutan explícitamente en el código y después de mucha búsqueda logré desarrollar la siguiente técnica sin la necesidad de una clase DbConfiguration o migraciones automáticas habilitadas:

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

Y si tuviéramos una migración como esta:

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

Lo usaríamos así:

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

Saludos.