You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET 6中通过Fluent Migrator获取当前数据库版本

问题

我正在.NET 6环境中使用Fluent Migrator。我了解Fluent Migrator会通过VersionInfo表判断需要执行的迁移操作(向上或向下迁移)。例如调用无参的runner.MigrateUp()时,它会自动读取数据库中的VersionInfo表来确定需要应用的迁移。

我的问题是:如何在C#代码中获取当前数据库版本,以便根据用户输入的版本号决定执行向上迁移还是向下迁移?我希望实现类似以下逻辑:

if (userInputVersion > currentVersion)
{
   runner.MigrateUp(userInputVersion)
}
else 
{
  runner.MigrateDown(userInputVersion) 
}

是否可以通过Fluent Migrator的方法实现,而无需直接查询数据库表?

回答

可以通过Fluent Migrator内置的IVersionInfoAccessor接口实现需求,无需直接查询VersionInfo表,该接口专门用于读取版本信息表的迁移记录。

实现步骤

  1. 注入或获取IVersionInfoAccessor实例
    在.NET 6的依赖注入环境中,直接通过构造函数注入IVersionInfoAccessor即可,Fluent Migrator会自动将其注册到DI容器:

    private readonly IMigrationRunner _runner;
    private readonly IVersionInfoAccessor _versionInfoAccessor;
    
    public MigrationHandler(IMigrationRunner runner, IVersionInfoAccessor versionInfoAccessor)
    {
        _runner = runner;
        _versionInfoAccessor = versionInfoAccessor;
    }
    
  2. 获取当前数据库的最高版本
    调用IVersionInfoAccessor.GetVersionInfo()可获取所有已应用的迁移记录,取其中最大的版本号作为当前数据库版本:

    var appliedMigrations = _versionInfoAccessor.GetVersionInfo().AppliedMigrations;
    // 无已应用迁移时,默认版本为0
    long currentVersion = appliedMigrations.Any() ? appliedMigrations.Max(m => m.Version) : 0;
    
  3. 执行版本判断与迁移操作
    结合用户输入的版本号,执行对应的迁移逻辑:

    long userInputVersion = // 从用户输入(如命令行、配置)获取目标版本
    
    if (userInputVersion > currentVersion)
    {
        _runner.MigrateUp(userInputVersion);
    }
    else if (userInputVersion < currentVersion)
    {
        _runner.MigrateDown(userInputVersion);
    }
    else
    {
        Console.WriteLine("数据库已处于目标版本,无需执行迁移");
    }
    

注意事项

  • 若你的迁移版本使用int而非默认的long类型,需调整代码中的类型匹配。
  • IVersionInfoAccessor仅能读取已应用的迁移记录,无法修改版本信息表。

内容的提问来源于stack exchange,提问作者Aiyuni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:05:01