entity framework - que - Consolidación de migraciones de FE en una nueva InitialCreate
migration mvc (3)
Considere leer este buen artículo de Rick Strahl: https://weblog.west-wind.com/posts/2016/jan/13/resetting-entity-framework-migrations-to-a-clean-slate
Básicamente, la solución no es trivial y necesita algo más que restablecer todas las migraciones en una porque tiene dos escenarios que deben encajar en UNA clase de migración:
- Crear una nueva base de datos => la clase de migración debe contener cada creación de tabla
- Mi base de datos ya está actualizada => Necesito una clase de migración vacía
Solución: La idea de este proceso es básicamente esta: la base de datos y el esquema de EF están actualizados y de la manera que usted lo desea, por lo que vamos a eliminar las migraciones existentes y crear una nueva migración inicial.
En resumen, los pasos para hacer esto son:
- Elimine la tabla _MigrationHistory de la base de datos
- Elimine los archivos de migración individuales en la carpeta Migraciones de su proyecto
- Habilitar migraciones en la consola del Administrador de paquetes
- Ingreso de la migración en PMC
- Comente el código dentro del método Up en la migración inicial
- Actualización de la base de datos en PMC (no hace más que crear la entrada de migración) Eliminar comentarios en el método inicial Ahora básicamente ha restablecido el esquema a la última versión.
- una vez que la migración comentada se haya ejecutado en la base de datos deseada, elimine el comentario del código de migración
He estado usando migraciones EF desde hace un tiempo y tengo más de 100 archivos de migración en mi proyecto. Me gustaría consolidarlos en una sola migración antes de seguir adelante, es decir, quiero reemplazar la migración InitialCreate existente con una nueva versión que tenga en cuenta todos mis cambios posteriores para poder eliminar todos los demás archivos de migración.
Hago esto muy fácilmente si no me preocupa perder todos los datos en el DB, pero lo estoy haciendo.
¿Cómo puedo lograr esto manteniendo todos los datos intactos y también conservando la capacidad de recrear la base de datos desde cero (sin datos) simplemente ejecutando Update-Database (que creo que no es posible utilizando el enfoque descrito por Julie Lerman )?
Debajo del procedimiento tiene la ventaja de trabajar sin hacer nada con los DB, __MigrationHistory puede permanecer como está. También funcionará si tiene múltiples entornos diferentes con diferentes versiones de la estructura, siempre que tenga las ramas para que coincidan.
Convertí la última migración en una migración inicial. El truco es usar la versión más antigua del código y DB que está en uso, reemplazar su última migración con una nueva migración inicial y eliminar todas las migraciones anteriores. Las sucursales más nuevas mantienen las migraciones más recientes, por lo que seguirán funcionando después de fusionarse con las sucursales más antiguas.
Así que comience en la rama MÁS ANTIGUA - PROD, normalmente - y haga:
- Eliminar todo menos la última migración
- Elimine el código de migración en los métodos "Arriba" y "Abajo" en la última migración
- Cambie la acción de compilación de la última migración a "Ninguno" para que EF lo ignore
- Cambie la conexión activa para apuntar a una base de datos DB local.
- Asegúrese de que esta base de datos DB local no exista
- add-migration Initial
- Copie el código arriba y abajo de la migración "inicial" creada a la última migración
- Eliminar migración inicial
- Cambia la acción de compilación de la última migración a "Compilar"
- Registrarse
- Fusionar cambios
- Prueba en la rama DEV en LocalDB DB: debe hacer la nueva migración inicial y las subsiguientes sin problemas
- Prueba en la rama principal en la última base de datos - no debería hacer nada
La nota anterior solo funciona si no agrega elementos a las migraciones que EF no hace por sí mismo. Por ejemplo, si agrega vistas de BD, etc., que la migración recién creada no las obtendrá, solo obtendrá los scripts que EF genera en función de su código.
Si no le preocupa mantener estas migraciones, lo que he hecho es eliminar todo en la carpeta de migraciones, y luego apuntar a una nueva base de datos en la cadena de conexión (o pasar una nueva). Después de eso, puede ejecutar el comando add-migration:
add-migration InitialCreate
Y debe crear la migración para usted.