版權聲明:歡迎評論和轉載,轉載請注明來源。 https://blog.csdn.net/zy332719794/article/details/8845405
工程用的MVC + Entity Framework,根據CodeFirst的程式設計理念,先建立模型再自動生産資料庫和資料表。
看起來這很友善,也給開發帶來很多便利,開發時不用考慮資料建庫建表。
是以首先建立架構,寫好實體和DbContext
當地我們運作程式的時候,程式會根據我們的資料庫配置檔案生成對應的資料庫表和字段
非常友善。
問題來了
一、當我們的程式開發到中途時,發現還需要一個字段。好,按照常理,就在對應的實體加一個屬性就是了,但當我們加入實體的時候,再次運作程式就報錯了。
有個最笨但簡單的方法,删除資料庫,再次運作程式。OK,問題接着又來了。
二、當我們的程式試運作一段時間後,需要增加一個字段。怎麼辦呢?還是按照常理來,在對應的實體加一個屬性,OK。接下來我們可能會想到
1、方案一:再次删掉資料庫,重新運作程式。可是我們的資料都丢失了,可以發現表是重建了,資料都丢失了。不科學。
2、方案二:直接在資料庫對應的表裡面加上我們在實體裡面命名的屬性字段,并且選擇對應的資料類型,好,想象中是可以的,而且運作沒有報錯,但實際會令我們失望。運作程式,程式仍然将我們的表重建,資料丢失。為什麼我們手動把資料表字段與實體字段設定成一緻了還會出錯呢?這個我也沒有深究。可能是EF架構另有玄機吧,望有高手指點。
3、方案三:首先備份現有表裡面的資料,再删除資料庫,運作我們的程式,新的表和字段都建好了,然後我們再想辦法不論是寫sql插入還是怎麼辦,反正很麻煩。而且如果遇到有自增主鍵關聯的,你還沒辦法插對應主鍵的記錄。是以仍不可行。
解決方法:
其實微軟早就有很好很完美的解決辦法了。通過網上搜集到的資料,簡單說明其操作方法
涉及到變更表結構和字段的,都可以用資料遷移的方法。
具體操作如下:
1、首先修改我們的實體。編譯通過。
2、打開“程式包管理器控制台”
3、打開之後如下圖所示,選中我們的Domain程式集
4、輸入“Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext”指令。别急,你得把MvcMovie.Models.MovieDBContext改成你的工程對應正确的類名,如下圖
5、指令執行之後,我們會發現我們的程式集裡多了一些檔案夾和檔案。這個是自動生成的。
6、執行指令“add-migration Initial”,其中“Initial”可以自定成其他名字。
7、執行指令“update-database”,成功執行。
8、運作我們的程式,我們會驚奇地發現,我們的表結構已經修改了,而且我們的資料也都還在。
進一步
問題已經解決了,我們再來深入一下這種遷移方式。
一、當我們增加列(增加實體字段)時,可以不必重複上面的所有操作。
1、隻需要将\Migrations\Configuration.cs檔案中的AutomaticMigrationsEnabled = false;改成true
2、然後程式包管理器控制台執行“update-database”,成功後,在啟動運作程式,我們就完成删除列的操作了,很簡單吧。
二、當我們删除列(删除實體字段)時,同樣使用上面的操作,沒有成功,報會丢失資料,是以不能簡單地執行“update-database”就能完成。
1、執行指令“add-migration Initial”。
2、執行指令“update database”。
3、運作程式,更新完畢。
三、這些都是簡單的增删操作,利用這種方式能進行很多修改結構的操作而不影響資料。但有些操作利用這種方法仍然不能實作,比如說修改資料的類型,如從字元串改成數值類型等。根據實際情況用不同的方式方法來解決。