Dot-Net

FluentMigrator 遷移成功,但未更改數據庫

  • January 22, 2022

我一定錯過了一些非常基本的東西。

我正在處理一個遺留項目,我正在嘗試將 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 表。

我發現如果您的 dbconnection 字元串為空,也會發生同樣的情況。錯誤的 db connstring:crash,找不到遷移標籤:crash.. 但是空 db string.. 默默地什麼都不做,只是查看並報告遷移工作。被警告。

老問題,但我會添加這個提示,因為這是Google引導我搜尋問題的 stackoverflow 文章。也許它會幫助某人。

是否記得在擦除數據庫時清除 VersionInfo 表?

如果您已刪除數據庫中的所有表,並希望該工具從頭開始重新創建數據庫,但它根本什麼都不做,您可能忘記清除/刪除 VersionInfo 表。FluentMigrator 然後將查看 VersionInfo 表,發現所有內容都已應用,並正確得出絕對什麼都不做的結論。比方說……嗯……好朋友告訴我這個提示……

引用自:https://stackoverflow.com/questions/4196463