如何在.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表,该接口专门用于读取版本信息表的迁移记录。
实现步骤
注入或获取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; }获取当前数据库的最高版本
调用IVersionInfoAccessor.GetVersionInfo()可获取所有已应用的迁移记录,取其中最大的版本号作为当前数据库版本:var appliedMigrations = _versionInfoAccessor.GetVersionInfo().AppliedMigrations; // 无已应用迁移时,默认版本为0 long currentVersion = appliedMigrations.Any() ? appliedMigrations.Max(m => m.Version) : 0;执行版本判断与迁移操作
结合用户输入的版本号,执行对应的迁移逻辑:long userInputVersion = // 从用户输入(如命令行、配置)获取目标版本 if (userInputVersion > currentVersion) { _runner.MigrateUp(userInputVersion); } else if (userInputVersion < currentVersion) { _runner.MigrateDown(userInputVersion); } else { Console.WriteLine("数据库已处于目标版本,无需执行迁移"); }
注意事项
- 若你的迁移版本使用
int而非默认的long类型,需调整代码中的类型匹配。 IVersionInfoAccessor仅能读取已应用的迁移记录,无法修改版本信息表。
内容的提问来源于stack exchange,提问作者Aiyuni
相关产品推荐
相关产品推荐

