Pergunta

Tenho problemas ao usar o MigratorScriptingDecorator.ScriptUpdate no Entity Framework 4.3.1.

Ao especificar sourceMigration e targetMigration, apenas minha migração inicial é gravada, o restante de minhas migrações fica vazio.

Insirai um relatório de bug no Microsoft Connect contendo código de reprodução.https://connect.microsoft.com/VisualStudio/feedback/details/731111/migratorscriptingdecorator-in-entity-framework-migrations-does-not-respect-sourcemigration-and-targetmigration

eu espero MigratorScriptingDecorator.ScriptUpdate("from", "to") para se comportar exatamente como o comando PM correspondente

PM> Update-Database -Script -SourceMigration from -TargetMigration to

O ScriptUpdate deve ser equivalente a Update-Database -Script?
Existem outras maneiras de gerar scripts de atualização a partir do código?

Foi útil?

Solução

Conforme observado no problema vinculado do Microsoft Connect, o problema era a reutilização do mesmo DbMigrator em vários MigratorScriptingDecoratorS.

O código original era

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("-------------------------------------");
}

o MigratorScriptingDecorator deve ser instanciado fora do loop assim:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top