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?

¿Fue útil?

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 MigratorScriptingDecorators.

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("-------------------------------------");
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top