C# 使用FluentMigrator获取挂起迁移的内容
我有使用FluentMigrator迁移的控制台应用程序,但现在我需要在实际迁移过程之前实施用户确认。我访问了repo源代码,了解了版本加载器以及如何使用C# 使用FluentMigrator获取挂起迁移的内容,c#,.net-core-3.1,fluent-migrator,C#,.net Core 3.1,Fluent Migrator,我有使用FluentMigrator迁移的控制台应用程序,但现在我需要在实际迁移过程之前实施用户确认。我访问了repo源代码,了解了版本加载器以及如何使用IServiceProvider获取未应用的迁移列表。但是还找不到打印将在MigrateUp()中使用的迁移SQL脚本的方法。我也在使用SQL Server包。有人能指点方向吗 private static void UpdateDatabase(IServiceProvider serviceProvider) { var runne
IServiceProvider
获取未应用的迁移列表。但是还找不到打印将在MigrateUp()
中使用的迁移SQL脚本的方法。我也在使用SQL Server包。有人能指点方向吗
private static void UpdateDatabase(IServiceProvider serviceProvider)
{
var runner = serviceProvider.GetRequiredService<IMigrationRunner>();
var versionLoader = serviceProvider.GetRequiredService<IVersionLoader>();
var migrationContext = serviceProvider.GetRequiredService<IMigrationContext>();
var migrations = runner.MigrationLoader.LoadMigrations()
.Where(migration => !versionLoader.VersionInfo.HasAppliedMigration(migration.Key))
.ToList();
// print migrations up expressions
foreach (var migration in migrations)
{
Console.WriteLine($"Pending migration: {migration.Value.GetName()}");
Console.WriteLine("SQL:");
migration.Value.Migration.GetUpExpressions(migrationContext);
foreach (var expression in migrationContext.Expressions)
{
Console.WriteLine(expression); // this just outputs "CreateTable Test" in my case
}
}
bool userAccepted = true; // TODO: get confirmation from user
if (!userAccepted)
return;
// Execute the migrations
runner.MigrateUp();
}
private static void UpdateDatabase(IServiceProvider服务提供者)
{
var runner=serviceProvider.GetRequiredService();
var versionLoader=serviceProvider.GetRequiredService();
var migrationContext=serviceProvider.GetRequiredService();
var migrations=runner.MigrationLoader.LoadMigrations()
.Where(migration=>!versionLoader.VersionInfo.HasAppliedMigration(migration.Key))
.ToList();
//打印向上迁移的表达式
foreach(迁移中的var迁移)
{
WriteLine($“挂起的迁移:{migration.Value.GetName()}”);
Console.WriteLine(“SQL:”);
migration.Value.migration.GetUpExpressions(migrationContext);
foreach(migrationContext.Expressions中的var表达式)
{
Console.WriteLine(expression);//在我的例子中,这只是输出“CreateTable Test”
}
}
bool userAccepted=true;//TODO:从用户处获得确认
如果(!userAccepted)
返回;
//执行迁移
runner.MigrateUp();
}
有一个imiglationgenerator
,可以通过使用iSeries Provider解决。但是,不幸的是,没有支持imiglationexpression
参数的方法(见下文),因此我必须为每种类型编写if-else
语句或使用反射。我使用了第二种选择。也许有更好的方法
var migrationGenerator=serviceProvider.GetRequiredService();
//打印向上迁移的表达式
foreach(迁移中的var迁移)
{
WriteLine($“挂起的迁移:{migration.Value.GetName()}”);
Console.WriteLine(“SQL:”);
migration.Value.migration.GetUpExpressions(migrationContext);
foreach(migrationContext.Expressions中的var表达式)
{
if(表达式为ExecuteSqlScriptExpression ExecuteSqlScriptExpression)
{
WriteLine(executeSqlScriptExpression.SqlScript);
}
else if(表达式为ExecuteSqlStatementExpression ExecuteSqlStatementExpression)
{
WriteLine(executeSqlStatementExpression.SqlStatement);
}
其他的
{
var processMethod=migrationGenerator.GetType().GetMethod(“Generate”,new[]{expression.GetType()});
var sql=(string)processMethod.Invoke(migrationGenerator,new[]{expression});
Console.WriteLine(sql);
}
}
}
只是一个想法。命令行界面具有将迁移输出到文件的/output
标志。看见您可以查看源代码以了解其工作原理。
var migrationGenerator = serviceProvider.GetRequiredService<IMigrationGenerator>();
// print migrations up expressions
foreach (var migration in migrations)
{
Console.WriteLine($"Pending migration: {migration.Value.GetName()}");
Console.WriteLine("SQL:");
migration.Value.Migration.GetUpExpressions(migrationContext);
foreach (var expression in migrationContext.Expressions)
{
if (expression is ExecuteSqlScriptExpression executeSqlScriptExpression)
{
Console.WriteLine(executeSqlScriptExpression.SqlScript);
}
else if (expression is ExecuteSqlStatementExpression executeSqlStatementExpression)
{
Console.WriteLine(executeSqlStatementExpression.SqlStatement);
}
else
{
var processMethod = migrationGenerator.GetType().GetMethod("Generate", new[] { expression.GetType() });
var sql = (string)processMethod.Invoke(migrationGenerator, new[] { expression });
Console.WriteLine(sql);
}
}
}