1

MigratorScriptingDecorator.ScriptUpdateEntityFramework4.3.1での使用に問題があります。

sourceMigrationとtargetMigrationを指定すると、最初の移行のみが書き込まれ、残りの移行は空になります。

コードの再現を含むMicrosoftConnectのバグレポートを入力しました。 https://connect.microsoft.com/VisualStudio/feedback/details/731111/migratorscriptingdecorator-in-entity-framework-migrations-does-not-respect-sourcemigration-and-targetmigration

MigratorScriptingDecorator.ScriptUpdate("from", "to")対応するPMコマンドとまったく同じように動作することを期待しています

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

ScriptUpdateは同等である必要がありUpdate-Database -Scriptますか?
コードから更新スクリプトを生成する他の方法はありますか?

4

1 に答える 1

3

リンクされたMicrosoftConnectの問題に記載されているように、問題はDbMigratorいくつかので同じものを再利用することでしたMigratorScriptingDecorator

元のコードは

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

次のように、ループの外側でインスタンス化するMigratorScriptingDecorator必要があります。

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("-------------------------------------");
}
于 2012-03-16T19:34:32.753 に答える