将FluentMigrator与现有数据库一起使用

时间:2014-03-06 12:17:15

标签: .net fluent-migrator .nettiers

我正在寻找一个可以使用.NetTiers的现有项目的迁移框架.NetTiers是一个需要CodeSmith生成数据访问代码的旧ORM。

我们有一些圆屋的经验,我们已成功使用它。在从Octopus Deploy运行部署时,我们还能够自动部署架构更改。相当简单,因为它只是SQL脚本的集合。

我有兴趣转到FluentMigrator。我喜欢FM DSL而且我发现this SO question非常有用,但是有一些我不理解的事情:

  1. 导入现有数据库架构的正确方法是什么?[*]?
  2. 将迁移部署到生产环境[**]的正确方法是什么?
  3. [*]我的假设是我使用SQL Server工具生成一个脚本,并使用ExecuteEmbeddedSql作为初始迁移。这是对的吗?

    [**]似乎有三种主要方式来运行迁移(Command Line,NAnt runner,MSBuild runner)。他们需要访问数据库才能运行。想象一下,我们希望将其部署到PROD环境中。开发人员和构建服务器无法访问此环境。你如何针对那种环境运行这些跑步者?

    我们通常的部署过程是生成需要作为部署的一部分进行部署的SQL脚本集合。 Ops作为部署的一部分运行它们,或者作为Octopus Deploy流程(powershell)的一部分自动运行,或者如果部署在Octopus之外,则手动运行。

    我们在这个特定项目中遇到的一个复杂因素是.NetTiers。这意味着我们必须使用.NetTiers运行CodeSmith代码生成,才能构建数据访问层,然后才能对这些实体和数据服务进行编码。因此,我们的工作流程必须是:

    1. 写入迁移
    2. 运行迁移以升级数据库(定位到特定的.NetTiers数据库)
    3. 针对特定的.NetTiers数据库(中央构建服务器)运行.NetTiers
    4. 针对新.NetTiers生成的实体,数据库字段等的代码
    5. 我喜欢转储.NetTiers,但遗憾的是重构不是一个可行的选择。

1 个答案:

答案 0 :(得分:15)

我终于解决了这个问题。可以在http://benpowell.org/deploying-database-migrations-in-net-using-fluentmigrator-teamcity-and-octopus-deploy/找到解决方案的完整大纲。

我总结了下面的博文。我的大部分问题都与对FluentMigrator缺乏了解有关。我将逐一挑选原始问题。

导入现有数据库架构的正确方法是什么?

我无法找到正确的方式,但我找到了一种对我有用的方法!我做出了以下核心决定:

  1. scripted off the entire database作为基线。我包括了所有表,过程,约束,视图,索引等。我将我的第一次迭代设置为该基线。我选择了没有DROP的CREATE选项。这将是我的迁移。
  2. 我运行了相同的脚本转储但仅选择DROP。这将是我的迁移。
  3. 基线迁移只需使用EmbeddedScript方法执行附加脚本(我也将脚本组织到迭代文件夹中)。

    [Tags(Environments.DEV, Environments.TIERS, Environments.CI, Environments.TEST)]
    [Migration(201403061552)]
    public class Baseline : Migration
    {
        public override void Up()
        {
            this.Execute.EmbeddedScript("BaselineUp.sql");
        }
    
        public override void Down()
        {
            this.Execute.EmbeddedScript("BaselineDown.sql");
        }
    }
    

    基线解决了......

    如何应对.NetTiers

    好的,这有点挑战。我创建了一个特定的.NetTiers数据库,我将用它来运行.NetTiers代码生成。在FluentMigrator中,您可以标记'迁移。我决定根据环境进行标记。因此,我有一个等级'标签以及' dev',' test',' uat',' prod'等的标签。这些如何运行将遵循后面。

    进行架构更改时,我会创建迁移并使用标记''专注于.NetTiers架构更改。然后,我从migrate.exe Visual Studio external tools中运行using that specific tag as a flag。与我的机器名匹配的app.config数据库连接将是所使用的数据库连接,因此我将其指向层数据库。现在我的迁移已经运行了我的.NetTiers源数据库已准备就绪。我现在可以运行.NetTiers Codesmith代码生成工具来生成新的DLL。

    .NetTiers解决了......

    将迁移部署到生产环境的正确方法是什么?

    我正在使用Octopus Deploy并且非常诚实,如果您要部署.NET应用程序,尤其是部署到多个服务器,这应该是您这样做的绝对首选工具!

    我不会详细介绍Octopus Deploy,但是在基本级you can hook TeamCity and Octopus deploy together。 OD提供了两个项目来帮助您前进。

    1. 一个名为Octopack的程序,它将您的应用程序包装为NuGet包。
    2. 一个TeamCity插件,它使TeamCity构建NuGet包,并将其作为在NuGet提要上公开的工件提供。
    3. Octopus Deploy然后使用该NuGet订阅源并将这些包部署到端点服务器。此部署过程的一部分是运行PreDeploy和PostDeploy Powershell脚本。在这里,我将使用我的特定标签运行migrate.exe应用程序。

      部署解决了......