12

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

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

我一直对迁移到 FluentMigrator 很感兴趣。我喜欢 FM DSL,我发现这个 SO 问题非常有用,但是有几件事我不明白:

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

[*] 我的假设是我使用 SQL Server 工具生成单个脚本并使用 ExecuteEmbeddedSql 作为初始迁移。那是对的吗?

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

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

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

  1. 写迁移
  2. 运行迁移以升级数据库(针对特定的 .NetTiers 数据库)
  3. 针对特定的 .NetTiers 数据库(中央构建服务器)运行 .NetTiers
  4. 针对新 .NetTiers 生成的实体、数据库字段等的代码

我很想转储 .NetTiers,但遗憾的是,重构目前不是一个可行的选择。

4

1 回答 1

18

我终于解决了这个问题。我的大部分问题都与对 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 架构更改。然后,我使用该特定标记作为标志Visual Studio 外部工具中运行migrate.exe。与我的机器名称匹配的 app.config 数据库连接将是使用的数据库连接,因此我将其指向 tiers 数据库。现在我的 migrate up 已经运行了,我的 .NetTiers 源数据库已经准备好了。我现在可以运行 .NetTiers Codesmith 代码生成工具来生成新的 DLL。

.NetTiers 解决了...

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

我正在使用 Octopus Deploy,老实说,如果您正在部署 .NET 应用程序,尤其是部署到多台服务器,这应该是您这样做的绝对首选工具!

我不会详细介绍 Octopus Deploy,但在基本层面上,您可以将 TeamCity 和 Octopus deploy 连接在一起。OD 提供两个项目来帮助您前进。

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

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

部署解决...

于 2014-08-18T09:49:24.497 回答