Dot-Net

將 FluentMigrator 與現有數據庫一起使用

  • January 20, 2020

我正在尋找一個遷移框架,該框架將與使用 .NetTiers 的現有項目一起使用,這是一種較舊的 ORM,需要 CodeSmith 生成數據訪問程式碼。

我們有一些roundhouse的經驗,並且我們已經成功地使用了它。在 Octopus Deploy 之外執行部署時,我們還能夠自動部署架構更改。相當簡單,因為它只是 SQL 腳本的集合。

我一直對遷移到 FluentMigrator 很感興趣。我喜歡 FM DSL,我發現這個 SO 問題非常有用,但是有幾件事我不明白:

  1. 導入現有數據庫模式的正確方法是什麼$$ * $$?
  2. 將遷移部署到生產環境的正確方法是什麼$$ ** $$?

$$ * $$我的假設是我使用 SQL Server 工俱生成單個腳本並使用 ExecuteEmbeddedSql 作為初始遷移。那是對的嗎? $$ ** $$執行遷移似乎有三種主要方法(命令行、NAnt 執行器、MSBuild 執行器)。他們需要訪問數據庫才能執行。想像一下,我們想將它部署到 PROD 環境。開發人員和建構伺服器無法訪問此環境。您如何針對該環境執行這些跑步者? 我們通常的部署過程是生成一組 SQL 腳本,這些腳本需要作為部署的一部分進行部署。Ops 將這些作為部署的一部分執行,或者作為 Octopus 部署過程 (powershell) 的一部分自動執行,或者如果部署在 Octopus 之外,則手動執行。

我們在這個特定項目中遇到的一個複雜問題是 .NetTiers。這意味著我們必須使用 .NetTiers 執行 CodeSmith 程式碼生成來建構數據訪問層,然後才能針對這些實體和數據服務進行編碼。因此,我們的工作流程必須是:

  1. 寫遷移
  2. 執行遷移以升級數據庫(針對特定的 .NetTiers 數據庫)
  3. 針對特定的 .NetTiers 數據庫(中央建構伺服器)執行 .NetTiers
  4. 針對新 .NetTiers 生成的實體、數據庫欄位等的程式碼

我很想轉儲 .NetTiers,但遺憾的是,重構目前不是一個可行的選擇。

我終於解決了這個問題。我的大部分問題都與對 FluentMigrator 缺乏了解有關。我會一一挑選出我原來的問題。

導入現有數據庫模式的正確方法是什麼?

我找不到“正確的方法”,但我可以找到適合我的方法!我做出了以下核心決定:

  1. 將整個數據庫編寫為基線。我包括了所有表、過程、約束、視圖、索引等。我將我的第一次迭代設置為基線。我選擇了沒有 DROP 的 CREATE 選項。這將是我的遷移。
  2. 我執行了相同的腳本轉儲,但只選擇了 DROP。這將是我的遷移。

基線遷移只需要使用EmbeddedScript方法來執行附加的腳本(我也將腳本組織到迭代文件夾中)。

[Tags(Environments.DEV, Environments.TIERS, Environments.CI, Environments.TEST)]
[Migration(201403061552)]
public class Baseline : Migration
{
   public override void Up()
   {
       this.Execute.EmbeddedScript("BaselineUp.sql");
   }

   public override void Down()
   {
       this.Execute.EmbeddedScript("BaselineDown.sql");
   }
}

基線解決…

如何處理 .NetTiers

好的,這有點挑戰。我創建了一個特定的 .NetTiers 數據庫,我將使用它來執行 .NetTiers 程式碼生成。在 FluentMigrator 中,您可以“標記”遷移。我決定根據環境進行標記。因此,我有一個“tiers”標籤以及“dev”、“test”、“uat”、“prod”等標籤。這些如何執行將在稍後進行。

在進行架構更改時,我會創建遷移並使用標籤“層”來關注 .NetTiers 架構更改。然後,我使用該特定標記作為標誌Visual Studio 外部工具中執行migrate.exe。與我的機器名稱匹配的 app.config 數據庫連接將是使用的數據庫連接,因此我將其指向 tiers 數據庫。現在我的 migrate up 已經執行了,我的 .NetTiers 源數據庫已經準備好了。我現在可以執行 .NetTiers Codesmith 程式碼生成工具來生成新的 DLL。

.NetTiers 解決了…

將遷移部署到生產環境的正確方法是什麼?

我正在使用 Octopus Deploy,老實說,如果您正在部署 .NET 應用程序,尤其是部署到多台伺服器,這應該是您這樣做的絕對首選工具!

我不會詳細介紹 Octopus Deploy,但在基本層面上,您可以將 TeamCity 和 Octopus deploy 連接在一起。OD 提供兩個項目來幫助您前進。

  1. 一個名為 Octopack 的程序,它將您的應用程序包裝為 NuGet 包。
  2. 一個 TeamCity 外掛,它使 TeamCity 建構 NuGet 包並將其作為在 NuGet 源上公開的工件提供。

Octopus Deploy 然後使用該 NuGet 源並將這些包部署到端點伺服器。此部署過程的一部分是執行 PreDeploy 和 PostDeploy Powershell 腳本。在這裡,我將使用我的特定標籤執行 migrate.exe 應用程序。

部署解決…

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