Как сначала использовать MigratorScriptingDecorator в коде Entity Framework? - PullRequest
1 голос
/ 14 марта 2012

У меня проблемы с использованием MigratorScriptingDecorator.ScriptUpdate в Entity Framework 4.3.1.

При указании sourceMigration и targetMigration записывается только моя первоначальная миграция, остальные миграции становятся пустыми.

Я ввел сообщение об ошибке в Microsoft Connect, содержащее код воспроизведения.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?
Есть ли другие способы генерацииобновить скрипты из кода?

1 Ответ

3 голосов
/ 16 марта 2012

Как отмечалось в связанной проблеме Microsoft Connect, проблема заключалась в повторном использовании одного и того же 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("-------------------------------------");
}

the 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("-------------------------------------");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...