重置EntityFramework數據遷移到潔凈狀態


前言

翻譯一篇有關EF數據遷移的文章,以備日后所用,文章若有翻譯不當的地方請指出,將就點看,廢話少說,看話題。【注意】:文章非一字一句的翻譯,就重要的問題進行解釋並解決。

話題引入

無法確定這種場景是否是大家也遇見過並且是頻繁出現的,這種場景通常出現在需要對大量的數據進行遷移,導致EF數據遷移使得EF遷移狀態呈現出一種不可用的狀態,最終出現在新的數據遷移上無法進行更新數據庫或者回滾。也就是說當進行數據遷移時有可能導致數據庫和EF架構出現不一致的狀態即所謂的異步,接下來我們將一步一步來解決這個問題。

溫馨提示:如果你確定要走重置數據遷移的路線,請確保備份你的代碼以及數據庫,以防出現的架構非你所預期,當然了,EF代碼生成器和架構匹配的如此完美,在數據庫中亦是如此,但是以防失效並且你不想在沒有備份的情況下陷入絕境,為什么這樣說呢?在遷移里,你可能有你自定義的代碼,此時將需要額外的工作來更新數據庫,此時無法保證這樣的工作是否能成功完成,所以為了安全,歸根結底,請備份。

移除和重置數據遷移

step one 

刪除我們進行數據遷移在數據庫中生成的表,如下:

 

首先刪除_MigrationHistory 表,通過刪除遷移記錄表來告訴數據遷移已經被應用,如果這個表一直存在,EF將檢測最新的版本的數據遷移是否已經被應用上,與此同時如果成功了則會拋出數據庫和EF架構不同步的錯誤,如果你刪除了這個表,EF將不會去檢測架構是否匹配

step two 

刪除項目中的數據遷移。如下:

我們需要留下Configuration.cs文件,因為它可能包含初始化數據添加代碼,當然你沒有需要初始化的數據代碼,我們也可以刪除這個文件或者整個文件夾。此時我們運行這個應用程序將不會出現任何差錯,因為此時在數據庫中沒有任何數據遷移表以及在項目中沒有遷移文件

step three

通過【Enable-Migrations】重新創建數據遷移

若未完全刪除整個項目的數據遷移文件夾則需要用上【Enable-Migrations -Force】命令

step four

通過【Add-Migration Initial】進行初始化數據遷移。

創建的文件里包含Up和Down方法定義了數據庫的架構

基於表的DbContext和Model類創建了表和外鍵以及其他約束的命令,EF通過DbContext找到每個Model類,指出其關系和外鍵並且通過應用定義在Model類的特性設置,最終以代碼來描述他們,此時你將看到如下

step five 

通過【Update-Database】命令更新到數據庫

此時你通過此命令來更新到數據庫則出現【數據庫已存在某表的對象】,此時為了解決這一點,我們可以通過注釋UP方法來偽造出遷移。在UP方法上加上【return】即可(注意:完成后刪除return,此時則回到了同步狀態),如下:

此時再來運行【Update-Database】命令即可成功,如下:

finally 

最后一步相對來說是最笨重也是繁重的,通過使用【Update-Database -script】來對本地和遠程的數據庫進行更新。最終將使得數據庫與EF架構處於同步的狀態。當然你覺得有些不對勁你可以通過VS中的SQL Server架構比較工具或者是Red Gate's 非常棒的SQL比較工具來進行比對。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM