65.9K
CodeProject 正在变化。 阅读更多。
Home

用于数据库迁移的 Fluent Migrator

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (11投票s)

2015 年 7 月 26 日

CPOL

5分钟阅读

viewsIcon

81090

downloadIcon

1070

Fluent Migrator 使数据库迁移变得非常容易。它是一个面向 .NET 的数据库迁移框架,使用流畅的接口来操作数据库。

引言

在开发应用程序时,我们通常手动管理数据库,即编写 SQL 脚本(用于创建和更新表、存储过程、函数等)然后执行它们,我们还需要以一定的顺序管理这些脚本,以便它们可以在上层环境中无缝执行。因此,将这些数据库更改与常规开发和部署相结合是一项艰巨的任务。

现在的好消息是 Fluent Migrator 可以解决以上所有问题。

什么是 Fluent Migrator

Fluent Migrator 是一个面向 .NET 的数据库迁移框架。它使用流畅的接口来操作数据库。要使用 Fluent Migrator,我们需要将模式更改写在具有两个方法 `Up()` 和 `Down()` 的类中。顾名思义,`Up()` 方法用于升级,`Down()` 方法用于降级数据库。这些类可以提交到版本控制系统。

Fluent Migrator 如何工作

迁移类是简单的 C# 类,它们继承自“`Migration`”基类。我们需要在每个类的 `Migration` 属性中放置一个唯一的标识符,该标识符充当迁移的版本号。此标识符可以是递增的整数,或者我们可以使用 YYYYMMDDHHMM 格式的数字,这样当多个开发人员创建迁移时,就不会发生冲突。

然后,我们实现 `Up()` 和 `Down()` 方法。例如,在 `Up()` 方法中,我们可以创建一个新表,在 `Down()` 方法中,我们删除该表。所有迁移类都保存在一个程序集中。

Fluent Migrator 提供了一个迁移运行程序工具(Migrate.exe),该工具按正确的顺序执行迁移类的 `Up()` 或 `Down()` 方法。我们可以将此工具集成到任何 CI(持续集成)工具中,如 Jenkins、Team-City 或 TFS,以实现迁移过程的自动化。

Fluent Migrator 还在数据库中维护一个“`Version`”表,以跟踪已执行的迁移版本。

逐步实现 Fluent Migrator

设置项目

实现 Fluent Migrator 是一项简单的任务。首先,在 Visual Studio 中打开您的现有应用程序,并在您的解决方案中添加一个新的“类库”类型的项目。您可以将其命名为“`DatabaseMigration`”。

使用包管理器控制台中的以下命令,在“`DatabaseMigration`”项目中安装 Fluent Migrator 的 NuGet 包

Install-Package FluentMigrator

这将安装最新包并将 Fluent Migrator 的引用添加到您的项目中。

有关使用 NuGet 包的更多信息,您可以访问以下链接:https://codeproject.org.cn/Tips/990440/How-to-Use-NuGet-Packages

使用迁移类升级数据库

现在,在“`DatabaseMigration`”项目中创建一个新文件夹,并将其命名为“Migrations”,以便存放所有迁移类。

接下来,在此文件夹中创建一个新类,并将其命名为“M0001_CreateMemberTable.cs”,然后将以下代码粘贴进去

using FluentMigrator;
namespace DatabaseMigration.Migrations
{
    [Migration(1)]
    public class M0001_CreateMemberTable:Migration
    {
        public override void Up()
        {
            Create.Table("Member")
                .WithColumn("MemberId").AsInt32().PrimaryKey().Identity()
                .WithColumn("Name").AsString(50)
                .WithColumn("Address").AsString()
                .WithColumn("MobileNo").AsString(10);
        }

        public override void Down()
        {
            Delete.Table("Member");
        }
    }
}

在这里,我们创建了一个派生自“`Migration`”类的类,版本号为 1,并实现了 `Up()` 和 `Down()` 方法。在 `Up()` 和 `Down()` 方法中,我们可以运行任何 SQL 命令,但 Fluent Migrator 提供了另一种通过使用 Fluent API 命令(如 `Create`、`Delete`、`Rename`、`Insert`、`Update`、`Execute` 等)来定义模式的方法。

在 `Up()` 方法中,我们正在创建一个带有某些列的“`Member`”表;在 `Down()` 方法中,我们正在删除“`Member`”表。 

现在编译您的项目,然后我们就可以执行迁移了。要执行迁移,我们有“Migrate.exe”,可以在包文件夹“packages\FluentMigrator.1.6.0\tools”的路径下找到。

从命令提示符运行以下命令来执行迁移

Migrate.exe /connection "data source=localhost;initial catalog=MyTemp;
User ID=sa;Password=******;" 
/db SQLserver2008 /timeout 600 /target ..\DatabaseMigration\bin\Debug\DatabaseMigration.dll

在这里,我们传递数据库的连接字符串、数据库服务器的类型(例如 SQLserver2008)、连接超时以及所有迁移类所在的程序集的路径。

为简单起见,我在“Utils”文件夹下创建了一个名为“MigrateDatabase.bat”的批处理文件,并将上述命令放入该文件中。当您执行此批处理文件时,它将显示以下输出

上面的输出显示“`Version`”表已创建,因为这是我们第一次执行迁移,然后我们的“`M0001_CreateMemberTable`”迁移成功执行。您可以检查数据库,您会发现如下所示创建了这两个表

检查“`Version`”表。您会发现有一条记录,其中迁移号为 `Version`,`date-time` 为 `AppliedOn`,迁移名称在 `Description` 列中。

使用 SQL 脚本升级数据库

现在让我们看另一个非常重要的场景,即我们希望使用 `Migration` 类执行 SQL 脚本。为此,请在您的项目中创建一个单独的文件夹,将其命名为“Scripts”,并将您的 SQL 脚本放在那里。

例如:我放了两个 SQL 脚本,一个用于创建存储过程,另一个用于删除该存储过程。

注意:不要忘记将两个文件的“生成操作”属性设置为“嵌入的资源”。

然后,创建另一个迁移类,将其命名为“M0002_CreateSP_GetAllMember.cs”,并将以下代码粘贴到该类文件中

using FluentMigrator;
namespace DatabaseMigration.Migrations
{
    [Migration(2)]
    public class M0002_CreateSP_GetAllMember : Migration
    {
        public override void Up()
        {
            Execute.EmbeddedScript("CreateSP_GetAllMember.sql");
        }

        public override void Down()
        {
            Execute.EmbeddedScript("DropSP_GetAllMember.sql");
        }
    }
}

在上面的代码中,我们只是使用 `Execute.EmbeddedScript` 函数执行我们的 SQL 脚本。

现在再次运行我们的批处理文件“MigrateDatabase.bat”,您会发现存储过程已创建,并且 `Version` 表现在有两个记录。

降级数据库 

将数据库回滚到特定版本非常容易。您需要使用版本号执行以下命令。

Migrate.exe /connection "data source=localhost;initial catalog=MyTemp;User ID=sa;Password=******;" 
/db SQLserver2008 /timeout 600 /task rollback --steps=1 /target ..\
DatabaseMigration\bin\Debug\DatabaseMigration.dll

在这里,我们使用 `task` 回滚开关,并带有 `--steps` 选项,并提供版本号 =1。因此,它将通过执行版本大于 1 的所有迁移脚本的 `Down()` 方法,将我们的数据库回滚到版本 1。在我们的例子中,它将执行“M0002_CreateSP_GetAllMember.cs”的 `Down()` 方法。

同样,我在 `Utils` 文件夹下创建了一个名为“MigrateDatabase-RollbackToVersion-1.bat”的批处理文件来执行上述命令。这将显示以下输出: 

输出显示“`M0002_CreateSP_GetAllMember`”迁移已成功还原。

现在检查 `Version` 表,您会发现版本号为 2 的第二条记录已被删除。

摘要

因此,通过这种方式,您可以使用 Fluent Migrator 轻松地升级和降级数据库。您还可以通过将其与任何 CI(持续集成)工具集成来自动化数据库迁移过程。我还提供了此应用程序的源代码以供参考,但要运行它,您首先需要安装 Fluent Migrator 的 NuGet 包。 点击此处下载源代码。

本文不包含 Fluent Migrator 提供的所有功能和命令。有关更多信息,请访问 https://github.com/schambers/fluentmigrator。 

© . All rights reserved.