1

我在使用MigratorScriptingDecorator.ScriptUpdateEntity 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
还有其他从代码生成更新脚本的方法吗?

4

1 回答 1

3

正如在链接的 Microsoft Connect 问题上所指出的那样,问题是DbMigrator在几个MigratorScriptingDecorators 上重复使用相同的问题。

原始代码是

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 回答