2014-03-12 80 views
3

語境:從EF5遷移到EF6與現有的遷移

我目前已經建立的實體框架5,一個系統,我們希望它升級到6

但是,它已擁有幾十家應用遷移。不僅如此,我們還有單元測試,通過創建測試數據庫和更新到最新並返回初始狀態來驗證所有遷移,以確保所有的Up和Down遷移都能夠正確應用。

從我一直在閱讀的內容來看,如果遷移有不同的EF版本號,Update-database不能越過這個邊界,這意味着覆蓋所有遷移的單元測試永遠不會通過。我可能會誤解,並且EF遷移可能會向後兼容。

問:

在這種情況下,會是明智的所有舊的遷移實際上合併成一個大的InitialCreate遷移(使用EF6重建),刪除MigrationHistory表和「假申請」遷移到實時數據庫(通過臨時註釋該遷移的代碼)來獲取新的歷史記錄?

其次,這是我們在不久的將來更新EF時必須要做的事嗎?如果是這樣的話,EF似乎缺少一些關於跨版本遷移的支持。

+0

你試過了嗎?你有這個問題的更新嗎? – hofnarwillie

+0

是的,我上面描述的是我最終做的。我會在下面的答案中詳細闡述一下。 –

回答

0

我也做了同樣的事情,今天(5月 - 26年),並沒有面對你所提到的 問題,曾使用過 http://msdn.microsoft.com/en-us/library/upgradeef6.aspx 所以我的老移民仍然是相同的建議的步驟。

雖然我面臨着與
其他一些問題 - Miniprofiler(需要使用新的與EF6支持)
- 和一個升級後重新創建索引的所有相關問題。

+0

您是否嘗試過使用這些混合遷移來創建例如新數據庫或在不同版本之間上下移動?在我的情況下,並不是說ef6不起作用。但是,我不能把所有的遷移調用到Up,然後我在單元測試中測試我的遷移。 –

+0

@PabloRomeo:是的,我試過降級我的數據庫,以它的工作原理有些低遷移版本,還試圖創建一個新的DB它也適用。 –

3

我最終最終實現了我在上面描述的問題本身。所有這些都已完成AFTER將所有內容遷移到EF6。

在我的情況下,我不僅需要將其應用到我的本地數據庫,而且還要應用到實時數據庫。

的步驟我用來實現這一目標,其中以下(希望我沒有忘記任何,因爲這是前陣子):

備份你的數據庫(包括本地和生活),以防萬一你需要撤消這個。

首先,我們需要爲整個數據庫創建一個合併遷移。

  1. 將您的ConnectionString更改爲指向新的空白數據庫。
  2. 物理刪除解決方案中的所有遷移以及最初創建的遷移。
  3. 運行Add-Migration InitialCreate,它應該添加遷移以重新生成整個數據庫。

現在,您並不是真的想要運行該遷移。在我的情況下,我只需要單元測試,或者從頭開始創建新的數據庫。

然後我們繼續:

  1. 更改ConnectionString回本地數據庫。
  2. 物理刪除數據庫中的MigrationHistory表(可能只是刪除行,我無法準確記得)。
  3. 註釋掉所有代碼在InitialCreate遷移中,以確保它在應用時不會執行任何操作。
  4. 運行Update-Database,它應該爲模擬數據庫的初始創建的MigrationHistory表添加一個條目。
  5. 取消註釋InitialCreate遷移中的代碼。

相同的過程可以應用於Live數據庫。您可以在ConnString中指向它,手動刪除遷移歷史記錄,評論遷移的實施並應用它,模擬創建,然後取消註釋。

從此,數據庫和遷移應該是同步的,和單元測試(在一個單獨的數據庫)應該能夠調用向下()和向上()上的所有遷移,仍然正常工作。