C# 使用FluentMigrator获取挂起迁移的内容

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

我有使用FluentMigrator迁移的控制台应用程序,但现在我需要在实际迁移过程之前实施用户确认。我访问了repo源代码,了解了版本加载器以及如何使用
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);
        }
    }
}