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

Reb*_*cca 12 .net .nettiers fluent-migrator

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

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

我有兴趣转到FluentMigrator.我喜欢FM DSL而且我发现这个SO问题非常有用,但是有一些我不理解的事情:

  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,但遗憾的是,重构不是一个可行的选择.

Reb*_*cca 15

我终于解决了这个问题.该解决方案的完整大纲可以在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");
    }
}
Run Code Online (Sandbox Code Playgroud)

基线解决了......

如何处理.NetTiers

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

在进行模式更改时,我创建了迁移并使用标记"层"来关注.NetTiers模式更改.然后,我使用特定标记作为标志,Visual Studio外部工具中运行migrate.exe.与我的机器名匹配的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应用程序.

部署解决了......

  • @dK-我无法在此处粘贴屏幕截图,但如果您查看 MSSMS 中任务 -> 生成脚本的高级选项模式,那么在“常规”下是选项“检查对象存在”。 (2认同)