昨天,我們把Model做了一些欄位驗證規則的編寫,也就是變化了Model,使其結構與資料庫不符合。
在ASP.NET Core中,把這個Entity Framework Core Model和Database同步的動作,稱之為Migration。在開發ASP.NET Core專案的過程中,我們會隔一段時間就做一次Migration,以維持Model和Database間的同步與一致,以免因不同步、不一致造成一些誤解。
Migration的指令主要有四個:
* Add-Migration :在進行Migration前,先新增一個Model快照檔,然後再執行Migration。請注意快照的順序不要搞錯了,所以在中採用時間註記命名的方式是比較好的方式。
* Remove-Migration:這個指令不需要何參數,就是在刪除最近一次的Migration快照檔案。
* Update-Database:可以指定Migration快照檔為參數,也可不指定任何參數。 不指定任何參數時,就使用最後一次建置的Migration快照檔來更新資料庫。如果指定了MIgration快照檔,就會把資料庫還原到指定快照檔的狀態。指定還原到早期的Migration快照檔是很危險的動作,萬一指派錯誤,資料庫就毁了,只能重建。重建就是把資料庫刪除,把己有的Migratiuon快照檔完全Remove,再重新生成一個第一次的Migration快照檔,然後再用Upgrade-Database指令來創建資料庫,這樣,你或許瞭解Model First是怎麼進行把Model同步到資料庫的作法了。
* Script-Migration:把全部的Migration快照檔的內容,轉成SQL腳本檔案,這樣,我們可以用SSMS來重現Migration的過程,找出資料庫毁損的原因。
在介紹我的實作前,各位先考慮一下,今天的實作其實是失敗的,各位不用照著作完才發現失敗。
那我幹嘛還要講,畢竟這是鐵人賽,忠實記錄我的文章。
好了,理論講的差不多了,我們現在來實作看看。首先我們在SSMS裏把Table Emp_Base的EmployeeCode欄位的屬性視窗打開,功能表路徑如下圖:
EmployeeCode欄位屬性視窗如下:
這樣,我們有個可供參照比較的基準點可以比對了。
現在到Visual Studio來實作Migration,我們到[工具]-->[NuGet套件管理員]-->[套件管理器主控台]:
打開[套件管理器主控台]的命令視窗:
然後先執行Add-Migration合令,命令及執行狀況如下圖:
除了命令執行外,我們還可以注意到專案方案總管視窗內多了一個Migration資料夾,和一個HRDBContextModelSnapshot.cs的C#程式檔案,這個檔案內容有興趣再看,基本上是一個現在Model的描述類別檔案。
然後,我們用Update-Migration命令開始進行Migration,命令執行狀況如下圖:
好吧!錯誤了,這按照官網的文件來做也是報錯,去查官方論壇,原來,在現在的Entity Framework Core版本,這是一個不支援的處理,要到更新版本(有傳聞說是Entity Framework 7)才會解決並支援。
有興趣瞭解的邦友可以參考這篇:Migrations: Improve existing database support #2167
以及這篇Update-Database command is not working in ASP.Net Core / Entity Framework 6 because object in database already exists,只是其中提到,目前不支援。
沒有解決的方法談了幹嘛?等能夠支援時就有用了,不是嗎?我想,應該有些解決方案,只是我沒找到捷徑。明天,我會來介紹我的土法煉鋼的方法。
總之,要維持Model和Database間的一致是必然的,日後部署才不會出狀況。