7

這是一個很長的問題,但如果我可以得到一些好的建議,我會非常感激。總之,我正在尋找MS SQL數據庫模式版本升級的好方法,這也要求將數據從已刪除的表格移動到新表格中。如何通過EF模型避免數據丟失首先進行數據庫模式升級?

我認爲堆棧溢出是最適合這個問題的地方(不是dba.stackexchange.com),因爲從核心來看,這對於使用實體框架的.NET開發人員來說是一個問題,其數據庫部分主要由自動生成的SQL腳本。


背景

.NET應用程序和SQL數據庫在Azure上運行(在工人角色的應用程序和SQL Azure的數據庫)。到目前爲止,版本升級工作正常,因爲所有數據庫模式更改都很簡單(如添加一個新列)。但是,從現在開始,我還需要處理升級過程中從一個表格到另一個表格的數據移動。 (我可以通過創建一個新的數據庫來臨時修復這個問題,使用舊數據庫中的數據生成腳本並手動編輯腳本以使其適合新的模式,但我希望有更好的方法)。

我使用實體框架,我使用模型優先。實體和關聯在Visual Studio數據模型設計器中定義,這種方法非常適合我的應用程序。

我使用dacpac升級Azure SQL數據庫,並且此方法在目前爲止運行良好(但現在我將丟失數據,所以現在我必須找到將數據移動到新表的方法)。

我希望我可以繼續使用實體框架並在設計器中定義實體/關聯,但如果需要的話,可以從dacpac升級切換到另一種技術,這很好。

升級方法直到現在

  1. 我在設計中添加新的實體(表),關聯(關係)和屬性(列)。
  2. 我右鍵單擊,選擇「從模型生成數據庫...」,這會導致一個.sql腳本丟棄舊的數據庫對象並創建新的數據庫對象。
  3. 我創建一個空的數據庫並運行腳本來創建表/鍵等。
  4. 在SQL Server Management Studio中,我右鍵單擊數據庫並選擇「任務 - >提取數據層應用程序...」。當嚮導完成時,我得到我需要的dacpac(實際上我現在可以刪除數據庫,因爲我只創建它可以獲取dacpac文件,因爲我不認爲我可以在Visual Studio數據模型設計器中生成它) 。
  5. 我右鍵單擊Azure SQL數據庫並選擇「任務 - >升級數據層應用程序...」並按照嚮導。 直到現在我從來沒有數據丟失,所以這工作得很好!

現狀

這是一個簡單的例子來說明這個問題,但我會從現在似乎陷入幾乎相同的情況經常。請看下圖中的架構的舊版本和新版本。假設數據庫中已有數據。我需要ImageFile中的數據以ImageFileOriginal或ImageFileProcessed結尾,具體取決於IsOriginal布爾值/位值。使用「升級數據層應用程序」我會收到數據丟失警報。你會建議如何處理這個問題?正如我剛纔所說,如果需要的話,可以將dacpac升級轉換爲其他技術。

Old schema New schema

我已閱讀有關Visual Studio數據庫項目,流利的遷移,紅門和實體設計數據庫生成電源包(它不支持的Visual Studio 2012),但我沒有找到一個這是一個好方法。我承認我沒有花一整天的時間去挖掘每項技術,但我肯定花了一些時間來嘗試找到一種好的方法。

回答

0

Configuration類設置構造函數如下:

public Configuration() 
{ 
    AutomaticMigrationsEnabled = true; 
    AutomaticMigrationDataLossAllowed = false; 
} 

設置AutomaticMigrationEnabled屬性true 意味着我們正在使用自動代碼第一遷移和另一屬性AutomaticMigrationDataLossAllowed設置爲false,意味着在遷移過程中沒有現有的數據從數據庫的表中的該遷移丟失。

整個Configuration類如下。

相關問題