仅针对一个特定迁移运行 FluentMigrator

Run FluentMigrator for one specific migration only

提问人:Ghassan Karwchan 提问时间:8/11/2023 最后编辑:Ghassan Karwchan 更新时间:8/12/2023 访问量:93

问:

我们使用 FluentMigrator 和 C# 来运行我们的数据库更改,我们不使用任何标签,因为我们有简单的解决方案,所以我们所有的迁移都没有任何标签。

我知道这似乎并不常见,但我希望他们的 API 中有一个解决方案。

是否有一种编程方式可以通过指定其版本号(无标记)来运行一个特定的迁移?

我不是在谈论

migrationRunner.MigrateUp(version);

因为这将运行该版本之前的所有迁移。

我想只应用一个特定的迁移,如果未应用它们,则不运行以前的版本。

因此,如果最后应用的版本是 26,并且我想运行版本 30。那么有没有办法只跑 30 而不跑 27,28,29 ?

正如我所说,我们所有的迁移都没有标签,所以很难用标签来做。

C# .NET Fluent-Migrator

评论

0赞 jdweng 8/11/2023
您有一个数据库,并且数据库中应该有一个版本号参数。然后,您可以查询数据库并获取版本,以便知道应运行哪个迁移。
0赞 Ghassan Karwchan 8/11/2023
我编辑了我的问题,使其更具体

答:

0赞 Orifjon 8/11/2023 #1

您可以在迁移表中将迁移版本更新为以前的版本,并使用 .它会在两者之间运行迁移,这将是您选择的版本。migrationRunner.MigrateUp(version);

评论

0赞 Ghassan Karwchan 8/11/2023
我在问题中说我不想使用 MigrateUp
0赞 Orifjon 8/11/2023
您不想使用它是否有特定原因?如您所述,它运行当前版本和指定版本之间的所有迁移。我的建议是将当前版本设置为您想要的版本,直接减去一个,这样它就只运行您想要的版本。
0赞 Ghassan Karwchan 8/12/2023 #2

事实证明,他们的 API 中有一种方法可以做到这一点。
我必须阅读他们的代码。

如果你想做这个疯狂的事情,你可以在代码中这样做:

private static void ApplySpecificMigration(IServiceProvider serviceProvider, long version)
{
    var runner = serviceProvider.GetRequiredService<IMigrationRunner>();

    
    var targetMigration = runner.MigrationLoader.LoadMigrations()
        .FirstOrDefault(migration => migration.Key == version);

    ((MigrationRunner) migrationRunner).ApplyMigrationUp(migration.Value, true);
}