12

我继承了一个使用 FluentMigrator 来管理迁移的项目。最初,当应用程序启动时,该项目正在执行进程中的迁移,但 IT 已经解决了这个问题,我们现在必须为我们所有的数据库更改提供脚本给 DBA。

作为此过渡的一部分,我已将迁移移至一个名为 Migrations 的新项目。当我尝试使用命令行工具执行迁移时,它似乎可以工作,但没有将迁移应用于数据库。数据库字符串是正确的,因为如果 VersionInfo 表不存在,则会创建它。在此处输入图像描述

有许多迁移,但大多数都非常简单。这是第一个的示例:

在此处输入图像描述

我正在使用 SQL Server 2012 和 FluentMigrator 1.2.1。

这是 gunr2171 的文本命令行:

.\Packages\FluentMigrator.1.2.1.0\tools\migrate.exe -c "Data Source=.;Integrated Security=True;Initial Catalog=portal_test" -db sqlserver2012 -a .\source\Migrations\bin\Debug\migrations.dll

以及示例迁移:

using System;
using System.Collections.Generic;
using System.Linq;
using FluentMigrator;

namespace Migrations
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1707:IdentifiersShouldNotContainUnderscores")]
    [Migration(1)]
    public class M001_CreateAccountTable : Migration
    {
        public override void Up()
        {
            Create.Table("Accounts")
                .WithColumn("Id").AsInt32().NotNullable().Identity().Unique()
                .WithColumn("PartnerCode").AsString().Nullable()
                .WithColumn("AccountType").AsInt32().NotNullable()
                .WithColumn("Code").AsString().NotNullable().Unique().PrimaryKey()
                .WithColumn("Name").AsString().NotNullable()
                .WithColumn("PrimaryDomainName").AsString().Nullable()
                .WithColumn("IsFederated").AsBoolean().NotNullable()
                .WithColumn("IsActive").AsBoolean().Nullable().WithDefaultValue(1)
                .WithColumn("FederatedEndpoint").AsString().Nullable()
                .WithColumn("CreatedBy").AsString().NotNullable()
                .WithColumn("CreatedOn").AsDateTime().NotNullable().WithDefaultValue(DateTime.Now)
                .WithColumn("ModifiedBy").AsString().NotNullable()
                .WithColumn("ModifiedOn").AsDateTime().NotNullable().WithDefaultValue(DateTime.Now);
        }

        public override void Down()
        {
            Delete.Table("Accounts");
        }
    }
}
4

2 回答 2

9

我得到了同样的结果,结果发现其中包含迁移的程序集是使用版本编写的,比如说 1.x,我使用 2.x 版本的 Migrate.exe 运行它们。

使用具有用于构建迁移 DLL 的相同版本的 Migrate.exe 为我解决了这个问题。

于 2015-04-23T19:42:17.310 回答
1

我有一个类似的问题,我migrate.exe从命令提示符运行以测试我的第一次迁移,看看它是如何工作的。

我发现我的问题是我已将Migrator Tags 此处记录InitialMigration的内容添加到班级顶部

[Tags("Localhost","Development","Test","Production")] // Added these
public class InitialMigration : Migration
{
  // Migration here
}

当我从命令提示符运行命令时,我错过了命令中的--tag参数,所以这个命令:

migrate.exe --conn="Server=.;Database=my_db;Trusted_Connection=True;Encrypt=True;Connection Timeout=30;" --provider=SqlServer --assembly="MyMigrations.dll" --task=migrate --output --outputFilename="src\migrated.sql"

应该是这样的:

migrate.exe --conn="Server=.;Database=my_db;Trusted_Connection=True;Encrypt=True;Connection Timeout=30;" --provider=SqlServer --assembly="MyMigrations.dll" --tag="localhost" --task=migrate --output --outputFilename="src\migrated.sql"

注意:第--tag一个脚本中缺少参数。

于 2018-07-09T05:46:15.023 回答