2012-03-14 2 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

내가 정확히 Update-Database -Script에 해당 해당 PM 명령

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

한다 ScriptUpdate 수처럼 행동하는 MigratorScriptingDecorator.ScriptUpdate("from", "to")을 기대?
코드에서 업데이트 스크립트를 생성하는 다른 방법이 있습니까?

답변

3

연결된 Microsoft Connect 문제에서 언급 한 바와 같이이 문제는 여러 MigratorScriptingDecorator에 동일한 DbMigrator을 재사용하는 것이 었습니다.

원래 코드는

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("-------------------------------------"); 
} 
관련 문제