Domanda

Ho problemi usando il MigratorScriptingDecorator.ScriptUpdate in Entity Framework 4.3.1.

Quando si specificano la sourcemigrazione e il targetmigrazione solo la mia migrazione iniziale viene scritta, il resto delle mie migrazioni diventa vuoto.

Ho inserito un rapporto di bug su Microsoft Connect contenente codice di riproduzione. https://connect.microsoft.com/visualstudio/feedback/details/731111/migratoriscriptingDecorator-in- mentalità-Framework-Migrations-Dees-Not-respect-sourCemigration-and-targetMigration

Mi aspetto che MigratorScriptingDecorator.ScriptUpdate("from", "to") si comportino esattamente come il comando PM corrispondente

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

DEVE SCRIPTUPDATE ESSERE EQUIVALENTE A Update-Database -Script?
Ci sono altri modi per generare script di aggiornamento dal codice?

È stato utile?

Soluzione

Come notato sul problema di Microsoft Connect collegato il problema è stato un riutilizzo dello stesso DbMigrator su diversi MigratorScriptingDecorators.

Il codice originale 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("-------------------------------------");
}
.

Il MigratorScriptingDecorator deve essere istanziato al di fuori del loop come questo:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top