FluentMigrator迁移成功,但对DB没有任何改变。

问题描述 投票:9回答:3

我一定是错过了一些很基本的东西。

我正在做一个遗留项目,我想把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

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

在命令行中,一切看起来都运行得很好--整个脚本都在放大,并且以 "我 "结束。

-- 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开始的,然后才发现它已经死了,而这个已经设置好了。)

有人能帮我一把吗? 它几乎看起来像一个事务是不是committing,或一些命令行选项,有迁移做一个干运行,但我没有看到它... ...

EDIT:我试过的其他事情

为了确认连接字符串是否使用了我期望的数据库,我重命名了数据库,之后得到了一个登录错误,正如预期的那样。

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

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

而不是逐条命令,但我得到的结果是一样的。 下面是测试的输出(注意,我编辑了pathes之类的)。

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表。

.net fluent-migrator
3个回答
19
投票

经过一些调查和0.8和1.0版本的测试,这似乎是FluentMigrator.Net的一个bug,与迁移运行器的事务管理有关--如果你用一个特定的版本号运行迁移,事务的提交永远不会被调用;如果你不指定版本号,它就会正常。

EDIT:

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


16
投票

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

确保你的迁移类使用公共可见性。

如果没有这个,你的迁移将被完全忽略。


0
投票

我发现,如果你的dbconnection字符串为空,也会发生这种情况。错误的db connstring:crash,没有找到迁移标签:crash......但db字符串为空......默默地什么都不做,但。检举 迁移工作。请注意。

© www.soinside.com 2019 - 2024. All rights reserved.