2014-03-06 65 views
11

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

我們有一些圓屋的經驗,我們已經成功地使用它。在部署運行Octopus Deploy時,我們也能夠自動部署模式更改。相當簡單,因爲它只是一組SQL腳本。

我一直有興趣轉向FluentMigrator。我喜歡的FM DSL,我發現this SO question非常有用,但有幾件事情我不神交:

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

我的假設是我使用SQL Server工具生成單個腳本並使用ExecuteEmbeddedSql作爲初始遷移。那是對的嗎?

[**]運行遷移似乎有三種主要方式(命令行,NAnt runner,MSBuild runner)。他們需要訪問數據庫才能運行。想象一下,我們希望將其部署到PROD環境。開發人員和構建服務器無法訪問此環境。你如何在這樣的環境中跑這些跑步者?

我們通常的部署過程是生成一組需要部署爲部署的SQL腳本。 Ops將它們作爲部署的一部分運行,或者自動作爲Octopus Deploy進程(powershell)的一部分,或者如果部署不在Octopus中則手動運行)。

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

  1. 寫遷移
  2. 運行遷移升級數據庫(針對特定.NetTiers數據庫)
  3. 具體對陣.NetTiers數據庫運行.NetTiers(中央構建服務器)
  4. 針對新.NetTiers
  5. 代碼生成的實體,數據庫字段等

我很想拋售.NetTiers,但可悲的是重構當前不是一個可行的選擇。

回答

14

我終於解決了這個問題。解決方案的完整提綱可在http://benpowell.org/deploying-database-migrations-in-net-using-fluentmigrator-teamcity-and-octopus-deploy/找到。

我總結了下面的博客文章。我的大部分問題都是因爲對FluentMigrator缺乏瞭解。我會一一挑選我的原始問題。

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

我找不到一個'正確的方式',但我可以找到一種適合我的方式!我作出了以下核心決定:

  1. I scripted off the entire database作爲基線。我包括所有表格,特效,約束,視圖,索引等。我將第一次迭代設置爲基準。我選擇了沒有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中,您可以'標記'遷移。我決定根據環境進行標記。因此,我有'分層'標籤以及'dev','test','uat','prod'等標籤。這些如何運行將在稍後進行。

在進行模式更改時,我創建了遷移並使用標記「層」專注於.NetTiers模式更改。然後我從Visual Studio external toolsusing that specific tag as a flag運行migrate.exe。與我的機器名稱匹配的app.config數據庫連接將是使用的數據庫連接,因此我將其指向層數據庫。現在我的遷移已經運行,我的.NetTiers源數據庫已準備就緒。我現在可以運行.NetTiers Codesmith代碼生成工具來生成新的DLL。

.NetTiers解決...

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

我正在使用Octopus Deploy並且非常誠實,如果您正在部署.NET應用程序,尤其是多個服務器,這應該是您絕對的工具!

我不會進入Octopus Deploy的細節,但在基本水平you can hook TeamCity and Octopus deploy together。外徑提供兩項讓你去。

  1. 一個名爲Octopack的程序,將您的應用程序封裝爲NuGet包。
  2. TeamCity插件使TeamCity構建NuGet包並將其作爲NuGet提要上公開的工件提供。

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

部署解決...

+0

.sql文件需要有生成操作:'嵌入式Resource' –

+0

@MortenHolmgaard正確的,對不起,我錯過了這一點。 – Junto

+0

我遇到了同樣的問題,因爲我們在已經成熟的數據庫上開始使用FluentMigrator。我們也有一些初始數據,所以我使用RedGates產品爲模式和數據創建腳本 –

相關問題