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

我们有一些回旋棚的经验,并且在使用它方面取得了成功。在Octopus Deploy之外运行部署时,我们还能够自动部署模式更改。相当容易,因为它只是SQL脚本的集合。

我对迁移到FluentMigrator感兴趣。我喜欢FM DSL,发现this SO question很有用,但是有一些我不满意的地方:


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


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

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

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

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


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


我很乐意转储.NetTiers,但可悲的是,重构目前尚不可行。

最佳答案

我终于解决了。我的大部分问题与对FluentMigrator的了解不足有关。我会一一挑选出我原来的问题。

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

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


scripted off the entire database作为基准。我包括所有表,过程,约束,视图,索引等。我将第一个迭代设置为该基准。我选择了不创建DROP的CREATE选项。这将是我的迁移。
我运行了相同的脚本转储,但仅选择了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 external tools中运行using that specific tag as a flag。与我的计算机名称匹配的app.config数据库连接将是所使用的数据库连接,因此我将其指向tiers数据库。现在我的迁移已运行,我的.NetTiers源数据库已准备就绪。现在,我可以运行.NetTiers Codesmith代码生成工具来生成新的DLL。

.NetTiers解决了...

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

我使用的是Octopus Deploy,说实话,如果您要将.NET应用程序部署到多个服务器上,尤其是到多个服务器,这绝对是您的最佳工具!

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


一个名为Octopack的程序,它将您的应用程序包装为NuGet程序包。
一个TeamCity插件,使TeamCity可以构建NuGet软件包,并将其作为暴露在NuGet提要上的工件提供。


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

部署已解决...

07-26 07:33
查看更多