Aplicación de migraciones
Aplicar migraciones en tiempo de ejecución
Es posible que la propia aplicación aplique migraciones mediante programación, normalmente durante el inicio. Aunque es productivo para el desarrollo local y las pruebas de migraciones, este enfoque no es adecuado para administrar bases de datos de producción, por los siguientes motivos:
- Si se ejecutan varias instancias de la aplicación, ambas aplicaciones podrían intentar aplicar la migración simultáneamente y producir un error (o lo que es peor, provocar daños en los datos).
- De forma similar, si una aplicación accede a la base de datos mientras otra aplicación la migra, esto puede causar problemas graves.
- La aplicación debe tener acceso elevado para modificar el esquema de la base de datos. Por lo general, se suele limitar los permisos de base de datos de la aplicación en producción.
- Es importante poder revertir una migración aplicada en caso de un problema. Las otras estrategias proporcionan esto fácilmente y de forma rápida.
- El SQL los comandos se aplican directamente por el programa, sin dar al desarrollador la oportunidad de inspeccionarlos o modificarlos. Esto puede ser peligroso en un entorno de producción.
Para aplicar migraciones mediante programación, llame a context.Database.Migrate() . Por ejemplo, una aplicación ASP.NET típica puede hacer lo siguiente:
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
db.Database.Migrate();
}
host.Run();
}
Tenga en Migrate() cuenta que se basa en el IMigrator servicio, que se puede usar para escenarios más avanzados. Use myDbContext.GetInfrastructure().GetService<IMigrator>() para acceder a él.
Advertencia
- Tenga en cuenta detenidamente antes de usar este enfoque en producción. La experiencia ha demostrado que la simplicidad de esta estrategia de implementación se ve compensada por los problemas que crea. Considere la posibilidad de generar scripts SQL a partir de migraciones en su lugar.
- No llame a
EnsureCreated()antes deMigrate().EnsureCreated()omite las migraciones para crear el esquema, lo cual provoca un error deMigrate().
Una vez agregadas las migraciones, deben implementarse y aplicarse a las bases de datos. Hay varias estrategias para hacerlo, siendo algunas más adecuadas para entornos de producción y otras para el ciclo de vida de desarrollo.
Nota
Sea cual sea la estrategia de implementación, inspeccione siempre las migraciones generadas y pruebelas antes de aplicarlas a una base de datos de producción. Una migración puede quitar una columna cuando la intención era cambiar su nombre o puede producir un error por diversos motivos cuando se aplica a una base de datos.
Scripts de SQL
La manera recomendada de implementar migraciones en una base de datos de producción es mediante la generación de scripts SQL producción. Entre las ventajas de esta estrategia se incluyen las siguientes:
- SQL los scripts se pueden revisar para obtener precisión; esto es importante, ya que la aplicación de cambios de esquema a las bases de datos de producción es una operación potencialmente peligrosa que podría implicar la pérdida de datos.
- En algunos casos, los scripts se pueden ajustar para ajustarse a las necesidades específicas de una base de datos de producción.
- SQL scripts se pueden usar junto con una tecnología de implementación e incluso se pueden generar como parte del proceso de CI.
- SQL scripts se pueden proporcionar a un DBA y se pueden administrar y archivar por separado.
Uso básico
A continuación se genera un script SQL de una base de datos en blanco a la migración más reciente:
dotnet ef migrations script
Con From (To implícito)
A continuación se genera SQL script de la migración dada a la migración más reciente.
dotnet ef migrations script AddNewTables
Con From y To
A continuación se genera SQL script de la migración from especificada a la migración to especificada.
dotnet ef migrations script AddNewTables AddAuditTable
Puede usar un valor from que sea más reciente que el valor to para generar un script de reversión.
Advertencia
Tome nota de los posibles escenarios de pérdida de datos.
La generación de scripts acepta los dos argumentos siguientes para indicar qué intervalo de migraciones se debe generar:
- La migración from debe ser la última migración aplicada a la base de datos antes de ejecutar el script. Si no se han aplicado migraciones, especifique
0(es el valor predeterminado). - La migración to debe ser la última migración que se va a aplicar a la base de datos después de ejecutar el script. El valor predeterminado es la última migración del proyecto.
Scripts de SQL idempotentes
Los scripts SQL generados anteriormente solo se pueden aplicar para cambiar el esquema de una migración a otra; es su responsabilidad aplicar el script adecuadamente y solo a las bases de datos en el estado de migración correcto. EF Core también admite la generación de scripts idempotentes, que comprueban internamente qué migraciones ya se han aplicado (a través de la tabla de historial de migraciones) y solo aplican las que faltan. Esto resulta útil si no sabe exactamente cuál fue la última migración aplicada a la base de datos o si va a implementar en varias bases de datos que pueden estar en una migración diferente.
Lo siguiente genera migraciones idempotentes:
dotnet ef migrations script --idempotent
Herramientas de la línea de comandos
Las herramientas de línea de comandos de EF se pueden usar para aplicar migraciones a una base de datos. Aunque es productivo para el desarrollo local y las pruebas de migraciones, este enfoque no es ideal para administrar bases de datos de producción:
- La SQL los comandos se aplican directamente mediante la herramienta, sin dar al desarrollador la oportunidad de inspeccionarlos o modificarlos. Esto puede ser peligroso en un entorno de producción.
- El SDK de .NET y la herramienta EF deben estar instalados en servidores de producción y requieren el código fuente del proyecto.
A continuación se actualiza la base de datos a la migración más reciente:
dotnet ef database update
A continuación se actualiza la base de datos a una migración determinada:
dotnet ef database update AddNewTables
Tenga en cuenta que esto también se puede usar para revertir a una migración anterior.
Advertencia
Tome nota de los posibles escenarios de pérdida de datos.
Para obtener más información sobre cómo aplicar migraciones a través de las herramientas de línea de comandos, vea la referencia EF Core herramientas de comandos.
Agrupaciones
Nota
Esta característica se introdujo en EF Core 6.0.
Los paquetes de migración son ejecutables de un solo archivo que se pueden usar para aplicar migraciones a una base de datos. Abordan algunas de las deficiencias del script SQL herramientas de línea de comandos:
- La ejecución SQL scripts requiere herramientas adicionales.
- El control de transacciones y el comportamiento de continuación de error de estas herramientas son incoherentes y, a veces, inesperados. Esto puede dejar la base de datos en un estado indefinido si se produce un error al aplicar migraciones.
- Los paquetes se pueden generar como parte del proceso de CI y ejecutarse fácilmente más adelante como parte del proceso de implementación.
- Las agrupaciones se pueden ejecutar sin instalar el SDK de .NET o la herramienta EF (o incluso el entorno de ejecución de .NET, cuando son independientes) y no requieren el código fuente del proyecto.
Lo siguiente genera una agrupación:
dotnet ef migrations bundle
A continuación se genera una agrupación autocontenida para Linux:
dotnet ef migrations bundle --self-contained -r linux-x64
Para obtener más información sobre la creación de agrupaciones, consulte la referencia EF Core herramientas .
efbundle
El archivo ejecutable resultante se denomina efbundle de forma predeterminada. Se puede usar para actualizar la base de datos a la migración más reciente. Es equivalente a ejecutar dotnet ef database update o Update-Database .
Argumentos:
| Argumento | Descripción |
|---|---|
<MIGRATION> |
Migración de destino. Si es "0", se revertirán todas las migraciones. El valor predeterminado es la última migración. |
Opciones:
| Opción | Short | Description |
|---|---|---|
--connection <CONNECTION> |
La cadena de conexión a la base de datos. El valor predeterminado es el especificado en AddDbContext o OnConfiguring. | |
--verbose |
-v |
Mostrar resultado detallado. |
--no-color |
No colorice la salida. | |
--prefix-output |
Prefijo de salida con nivel. |
En el ejemplo siguiente se aplican las migraciones a una instancia SQL Server local con el nombre de usuario y la contraseña especificados.
.\efbundle.exe --connection 'Data Source=(local)\MSSQLSERVER;Initial Catalog=Blogging;User ID=myUsername;Password=myPassword'