Intentar migraciones de secuencias de comandos desde el código de Entity Framework 6.2, pero la generación de secuencias de comandos de migración hacia abajo falla cuando las migraciones de origen y de destino se especifican explícitamente.
Por ejemplo, tengo un proyecto de prueba DbContext que contiene tres migraciones:
201506161504528_InitialCreate202202102238227_Add_Entity_FantasticalCreature202202102239481_FantasticalCreature_Add_IsWinged_Add_HasTailLa creación de secuencias de comandos de una migración ascendente funciona bien explícitamente con estos comandos:
Update-Database -SourceMigration "201506161504528_InitialCreate" ` -TargetMigration "202202102238227_Add_Entity_FantasticalCreature" ` -Script -Verbose .\migrate.exe "TestContext.dll" /targetMigration="202202102238227_Add_Entity_FantasticalCreature" /scriptFile="script.sql" /sourceMigration="201506161504528_InitialCreate" /verboseAdemás, el uso de MigratorScriptingDecorator y ScriptUpdate con parámetros similares también generará el script ascendente al especificar explícitamente las migraciones de origen y de destino.
Sin embargo, todos los métodos descritos anteriormente fallarán cuando se intente hacer lo contrario, es decir, escribir una migración descendente en la que tanto el destino como el origen se especifican explícitamente y donde el origen es un MigrationId "inferior".
Por ejemplo, la Update-Database invocada así:
update-database -SourceMigration "202202102238227_Add_Entity_FantasticalCreature" ` -TargetMigration "201506161504528_InitialCreate" ` -Script -Verboseresulta en una excepción:
System.Data.Entity.Migrations.Infrastructure.MigrationsException: no se admite la creación de secuencias de comandos para degradar entre dos migraciones específicas.
en System.Data.Entity.Migrations.Infrastructure.MigratorScriptingDecorator.ScriptUpdate(String sourceMigration, String targetMigration)
en System.Data.Entity.Migrations.Design.ToolingFacade.ScriptUpdateRunner.RunCore()
en System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()No se admite el scripting de la degradación entre dos migraciones específicas.
Se produce la misma excepción al intentar realizar la migración de secuencias de comandos hacia abajo de forma explícita utilizando migrate.exe o MigratorScriptingDecorator.ScriptUpdate también.
Sin embargo , si la migración de origen no se especifica explícitamente, se especifica una migración de destino y se proporciona una cadena de conexión a una base de datos que se encuentra en una migración "más alta" que la migración de destino especificada, entonces los tres métodos descritos anteriormente generarán con éxito una Script SQL de migración hacia abajo.
Por ejemplo, generar con éxito la migración descendente utilizando Update-Database :
# Assumes TestContextDb-01 is currently at migration 2 or 3. Update-Database -TargetMigration "201506161504528_InitialCreate" ` -Script ` -ConnectionString "Data Source=localhost; Initial Catalog=TestContextDb-01; Integrated Security=true;" ` -ConnectionProviderName "System.Data.SqlClient" -VerbosePor qué es eso:
FWIW, tengo la sospecha de que las herramientas de migración pueden crear implícitamente una base de datos localdb o SQL Server Express para realizar la migración ascendente explícita del script. No sé cómo eso necesariamente se relaciona con todo lo expuesto anteriormente, ni entiendo por qué no se puede hacer lo mismo para la migración explícita de secuencias de comandos hacia abajo.
¡Cualquier idea es muy apreciada!