¿Cómo puedo usar MigratorScriptingDecorator en Entity Framework code first?
-
13-12-2019 - |
Pregunta
Tengo problemas con el MigratorScriptingDecorator.ScriptUpdate
en el Marco de la Entidad 4.3.1.
Cuando se especifica sourceMigration y targetMigration sólo mi inicial de la migración se presenta por escrito, el resto de mi migraciones quedado vacío.
He entrado en un informe de error en Microsoft Connect que contiene la reproducción de código.https://connect.microsoft.com/VisualStudio/feedback/details/731111/migratorscriptingdecorator-in-entity-framework-migrations-does-not-respect-sourcemigration-and-targetmigration
Espero MigratorScriptingDecorator.ScriptUpdate("from", "to")
se comportan exactamente igual que el correspondiente comando PM
PM> Update-Database -Script -SourceMigration from -TargetMigration to
Debe ScriptUpdate ser equivalente a Update-Database -Script
?
Hay otras formas de generación de scripts de actualización de código?
Solución
Como se señaló en los enlaces de Microsoft Connect problema el problema era una reutilización de los mismos DbMigrator
en varios MigratorScriptingDecorator
s.
El código original fue
DbMigrator efMigrator = new DbMigrator(new Configuration());
var pendingMigrations = efMigrator.GetLocalMigrations().ToList();
pendingMigrations.Insert(0, "0");
foreach (var migration in pendingMigrations.Zip(pendingMigrations.Skip(1), Tuple.Create))
{
var sql = new MigratorScriptingDecorator(efMigrator).ScriptUpdate(migration.Item1, migration.Item2); // <-- problem here, the efMigrator is reused several times
Console.WriteLine("Migration from " + (migration.Item1 ?? "<null> ") + " to " + (migration.Item2 ?? "<null> "));
Console.WriteLine(sql);
Console.WriteLine("-------------------------------------");
}
el MigratorScriptingDecorator
se deben crear instancias fuera del bucle como este:
DbMigrator efMigrator = new DbMigrator(new Configuration());
var pendingMigrations = efMigrator.GetLocalMigrations().ToList();
pendingMigrations.Insert(0, "0");
var scriptMigrator = new MigratorScriptingDecorator(efMigrator); // <-- now only one MigratorScriptingDecorator is created for the DbMigrator
foreach (var migration in pendingMigrations.Zip(pendingMigrations.Skip(1), Tuple.Create))
{
var sql = scriptMigrator.ScriptUpdate(migration.Item1, migration.Item2);
Console.WriteLine("Migration from " + (migration.Item1 ?? "<null> ") + " to " + (migration.Item2 ?? "<null> "));
Console.WriteLine(sql);
Console.WriteLine("-------------------------------------");
}