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


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

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

我有兴趣转到FluentMigrator。我喜欢FM DSL而且我找到了 这个问题 非常有用,但有几件事我不理解:

  1. 导入现有数据库模式[*]的正确方法是什么?
  2. 将迁移部署到生产环境的正确方法是什么[**]?

[*]我的假设是我使用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生成的实体,数据库字段等的代码

我很想抛弃.NetTiers,但遗憾的是重构不是一个可行的选择。


4183
2018-03-06 12:17


起源



答案:


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

我总结了下面的博客文章。我的大多数问题都与对FluentMigrator缺乏了解有关。我会逐一挑出原来的问题。

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

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

  1. 一世 编写整个数据库的脚本 作为基线。我包括了所有表,过程,约束,视图,索引等。我将我的第一次迭代设置为该基线。我选择了没有DROP的CREATE选项。这将是我的迁移。
  2. 我运行了相同的脚本转储,但只选择DROP。这将是我的迁移。

基线迁移只需要使用 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中,您可以“标记”迁移。我决定根据环境进行标记。因此,我有'tiers'标签以及'dev','test','uat','prod'等标签。这些如何运行将在稍后进行。

在进行模式更改时,我创建了迁移并使用标记“层”来关注.NetTiers模式更改。然后我跑了 migrate.exe 在......之外 Visual Studio外部工具  使用该特定标记作为标志。与我的机器名匹配的app.config数据库连接将是使用的数据库连接,因此我将其指向层数据库。现在我的迁移已运行我的.NetTiers源数据库已准备就绪。我现在可以运行.NetTiers Codesmith代码生成工具来生成新的DLL。

.NetTiers解决了......

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

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

我不会详细介绍Octopus Deploy,但是在基础层面 你可以将TeamCity和Octopus一起部署。 OD提供了两个项目来帮助您前进。

  1. 一个名为Octopack的程序,它将您的应用程序包装为NuGet包。
  2. TeamCity插件,使TeamCity构建NuGet包并将其作为在NuGet提要上公开的工件提供。

然后,Octopus Deploy使用该NuGet订阅源并将这些包部署到端点服务器。此部署过程的一部分是运行PreDeploy和PostDeploy Powershell脚本。在这里,我将使用我的特定标签运行migrate.exe应用程序。

部署解决了......


15
2017-08-18 09:49



.sql文件需要具有Build Action: Embedded Resource - Morten Holmgaard
@MortenHolmgaard正确,对不起,我错过了。 - Junto
我们在已经成熟的数据库上开始使用FluentMigrator时遇到了同样的问题。我们还有一些初始数据,因此我使用RedGates产品为模式和数据创建脚本 - Arne H. Bitubekk


答案:


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

我总结了下面的博客文章。我的大多数问题都与对FluentMigrator缺乏了解有关。我会逐一挑出原来的问题。

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

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

  1. 一世 编写整个数据库的脚本 作为基线。我包括了所有表,过程,约束,视图,索引等。我将我的第一次迭代设置为该基线。我选择了没有DROP的CREATE选项。这将是我的迁移。
  2. 我运行了相同的脚本转储,但只选择DROP。这将是我的迁移。

基线迁移只需要使用 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中,您可以“标记”迁移。我决定根据环境进行标记。因此,我有'tiers'标签以及'dev','test','uat','prod'等标签。这些如何运行将在稍后进行。

在进行模式更改时,我创建了迁移并使用标记“层”来关注.NetTiers模式更改。然后我跑了 migrate.exe 在......之外 Visual Studio外部工具  使用该特定标记作为标志。与我的机器名匹配的app.config数据库连接将是使用的数据库连接,因此我将其指向层数据库。现在我的迁移已运行我的.NetTiers源数据库已准备就绪。我现在可以运行.NetTiers Codesmith代码生成工具来生成新的DLL。

.NetTiers解决了......

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

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

我不会详细介绍Octopus Deploy,但是在基础层面 你可以将TeamCity和Octopus一起部署。 OD提供了两个项目来帮助您前进。

  1. 一个名为Octopack的程序,它将您的应用程序包装为NuGet包。
  2. TeamCity插件,使TeamCity构建NuGet包并将其作为在NuGet提要上公开的工件提供。

然后,Octopus Deploy使用该NuGet订阅源并将这些包部署到端点服务器。此部署过程的一部分是运行PreDeploy和PostDeploy Powershell脚本。在这里,我将使用我的特定标签运行migrate.exe应用程序。

部署解决了......


15
2017-08-18 09:49



.sql文件需要具有Build Action: Embedded Resource - Morten Holmgaard
@MortenHolmgaard正确,对不起,我错过了。 - Junto
我们在已经成熟的数据库上开始使用FluentMigrator时遇到了同样的问题。我们还有一些初始数据,因此我使用RedGates产品为模式和数据创建脚本 - Arne H. Bitubekk