如何首先在实体框架代码中使用 MigratorScriptingDecorator?
-
13-12-2019 - |
题
我在使用时遇到问题 MigratorScriptingDecorator.ScriptUpdate
在实体框架 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
?
还有其他方法可以从代码生成更新脚本吗?
解决方案
正如链接的 Microsoft Connect 问题中所指出的,问题是重复使用相同的 DbMigrator
在几个 MigratorScriptingDecorator
s。
原来的代码是
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("-------------------------------------");
}
不隶属于 StackOverflow