2012-03-14 7 views
1

Entity Framework 4.3.1でMigratorScriptingDecorator.ScriptUpdateを使用する際に問題があります。最初にEntity FrameworkコードでMigratorScriptingDecoratorを使用するにはどうすればよいですか?

sourceMigrationとtargetMigrationを指定すると、最初のマイグレーションのみが書き込まれ、残りのマイグレーションは空になります。

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

私はScriptUpdateがUpdate-Database -Scriptと同等であるべきMigratorScriptingDecorator.ScriptUpdate("from", "to")が正確に対応するPMコマンドのよう

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

を振る舞うことを期待?
コードから更新スクリプトを生成する他の方法はありますか?

答えて

3

リンクされたMicrosoft Connectの問題に記載されているように、この問題は同じDbMigratorを複数のMigratorScriptingDecoratorに再利用して発生しました。

元のコードは、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("-------------------------------------"); 
} 

た:

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("-------------------------------------"); 
} 
関連する問題