10

我一定错过了一些非常基本的东西。

我正在处理一个遗留项目,我正在尝试将 FluentMigrator 纳入其中,因为我有一些有趣的数据库更改和数据迁移即将到来,我认为使用这个工具会变得更加容易。

对于初始迁移,我只想将数据库按原样升级到当前的生产版本。为了简化初始迁移,我编写了 SQL Server 2008 数据库的脚本,迁移将脚本命令作为一系列 SQL 命令执行。

为了测试它,我创建了一个完全空的数据库,并尝试使用以下命令从命令行运行它:

> migrate -a "C:\My\Project\Path\bin\debug\Rds.MyProjName.DBMigrations.dll" 
-db SqlServer2008 -conn "Data Source=.\SQLEXPRESS2008;Initial Catalog=myNewDbName;
Integrated Security=SSPI" -version=20100901000000

指定的版本是第一个迁移类的迁移属性上的时间戳。

在命令行,一切似乎都运行良好 - 整个脚本放大,并以:

-- CreateProductionDbCircaSep2010: migrated

但是,当我查看数据库时,它仍然是空的。里面绝对什么都没有。我的 Up 方法如下所示:

public override void Up()
{
    var cmds = LoadEmbeddedResources
        .GetEmbeddedResource("scripted_db_2010-09-01.sql")
        .AsString()
        .ParseCommands();

    foreach (var c in cmds) {
        Execute.Sql(c);
    }

    CreateReferenceData();
}

(仅供参考,我正在解析脚本而不是按原样运行它,因为我在发现它已死之前使用 Migrator.Net 开始,并且已经设置好了。)

谁能帮我一把?看起来好像没有提交事务,或者打开了一些让迁移进行试运行的命令行选项,但我没有看到它......

编辑:我尝试过的其他事情

为了确认连接字符串正在使用我期望的数据库,我重命名了数据库,然后出现了登录错误,正如预期的那样。

为了进一步测试,我缩短了脚本的长度,并尝试使用

public override void Up()
{
    Execute.Script(@"..\Resources\test.sql"); 
}

而不是逐个命令,但我得到了相同的结果。这是该测试的输出(注意,我编辑了路径等):

C:\My\Project\Path\FluentMigrator.Net\ >migrate -a "C:\My\Project\Path\bin\debug
\My.Project.DBMigrations.dll" -db SqlServer2008 -conn "Data Source=.\SQLEXPRESS2
008;Initial Catalog=myNewDbName;Integrated Security=SSPI" -version=2010090100000
0
Using Database SqlServer2008 and Connection String Data Source=.\SQLEXPRESS2008;
Initial Catalog=myNewDbName;Integrated Security=SSPI
-- VersionMigration: migrating ===============================================

-- CreateTable VersionInfo
-- VersionMigration: migrated
-- CreateProductionDbCircaSep2010: migrating =================================

-- ExecuteSqlScript C:\My\Project\Path\FluentMigrator.Net\..\Resources\test.sql
-- CreateProductionDbCircaSep2010: migrated

然而数据库中没有表——甚至没有预期的 VersionInfo 表。

4

4 回答 4

20

在对 0.8 和 1.0 版本进行一些调查和测试后,这似乎是 FluentMigrator.Net 中与迁移运行器的事务管理相关的一个错误 - 如果您使用特定版本号运行迁移,则永远不会调用事务的提交;如果你不指定版本号,没关系。

编辑:

此后,我已向该项目提交了一个补丁,该补丁已被接受。这不再是问题。

于 2010-11-19T12:54:55.360 回答
17

这听起来很愚蠢,但我浪费了几个小时,所以它属于这里:

确保您的迁移类使用公开可见性。

没有这个,您的迁移将被完全忽略。

于 2014-01-10T21:27:11.887 回答
3

我发现如果您的 dbconnection 字符串为空,也会发生同样的情况。错误的 db connstring:crash,找不到迁移标签:crash.. 但是空 db string.. 默默地什么都不做,只是查看并报告迁移工作。被警告。

于 2020-04-23T21:27:28.667 回答
1

老问题,但我会添加这个提示,因为这是谷歌引导我搜索问题的 stackoverflow 文章。也许它会帮助某人。

是否记得在擦除数据库时清除 VersionInfo 表?

如果您已删除数据库中的所有表,并希望该工具从头开始重新创建数据库,但它根本什么都不做,您可能忘记清除/删除 VersionInfo 表。FluentMigrator 然后将查看 VersionInfo 表,发现所有内容都已应用,并正确得出绝对什么都不做的结论。比方说……嗯……好朋友告诉我这个提示……

于 2021-10-07T22:08:37.550 回答