Tengo una aplicación web que instalo en las computadoras de mis clientes para su uso interno. Uso C# MVC5 y Entity Framework de código primero. Usé la migración automática = verdadero pero me detuve y lo configuré en falso. Lo instalé en un entorno de producción (lanzamiento), con un paquete de implementación (sin Visual Studio).
Tengo un cliente con la aplicación - versión 1. Ahora quiero actualizar a la versión 2. Quiero habilitar la actualización de la base de datos de la aplicación (en el archivo de producción, con la instalación de CMD desde un paquete), pero tener la posibilidad de degradar la DB si habrá algún problema, pero sin eliminar las filas existentes.
Por ejemplo, si tengo una tabla "Elementos" y Elementos tiene Key, Name, Location . En la actualización, agrego una nueva columna: Email . Al degradar, la nueva columna se eliminará. Creé la migración en Visual Studio. Obtengo este código (es solo para el ejemplo, tengo más migraciones):
public partial class AddEmail : DbMigration { public override void Up() { AddColumn("dbo.Items", "Email", c => c.String()); } public override void Down() { DropColumn("dbo.Items", "Email"); } }Ahora, instalé la nueva versión de la aplicación en la versión existente y funcionó bien: se agregó la nueva columna y funcionó con el nuevo código. Agregué algunos elementos (filas).
Ahora, ¿cómo puedo volver a instalar la versión anterior para que se elimine la nueva columna? En realidad, quiero revertir las nuevas migraciones, pero no quiero perder las nuevas filas, solo las nuevas columnas.
En este artículo hay una explicación de cómo crear un script que migre de una migración a otra: actualización o degradación. Así que ejecuté en la consola del administrador de paquetes:
Update-Database -Script -TargetMigration: MyMigration1
y obtuve el script SQL.
Necesitaba revisarlo y arreglarlo un poco y luego simplemente lo ejecuté en la base de datos de producción para degradar la base de datos.