Come posso usare prima il codice migratoreDecorator in Entity Framework?
-
13-12-2019 - |
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?
Soluzione
Come notato sul problema di Microsoft Connect collegato il problema è stato un riutilizzo dello stesso DbMigrator
su diversi MigratorScriptingDecorator
s.
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("-------------------------------------");
}
.