我一定错过了一些非常基本的东西。
我正在处理一个遗留项目,我正在尝试将 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 表。