在本節中,我們将使用Entity Framework Code First 資料遷移功能将模型類的改變應用到資料庫中。
預設情況下,當我們使用Entity Framework Code First 自動建立一個資料庫,像我們之前教程中講的那樣,Code First 添加一個table幫我們跟蹤資料庫結構是否與模型類同步。如果不同步,Entity Framework 将抛出一個錯誤,這樣更友善我們在開發的時候發現問題,否則隻能在運作時通過晦澀的錯誤來查找了。
在解決方案資料總管中,删除自動建立的 Movies.mdf 檔案。
在工具菜單中,選擇“庫程式包管理器”>“程式包管理器控制台”:
在“程式包管理器控制台”視窗中輸入:Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext
Enable-Migrations 指令建立了一個Migrations檔案夾和Configuration.cs檔案。
打開 Configuration.cs 檔案,使用以下代碼替換 Seed 方法:
使用這段代碼的時候,需要添加 using MvcMovie.Models 的引用。
Code First 資料遷移在每次遷移(在程式包管理器控制台中調用 update-database)的時候都會調用Seed方法。
在進行下一步之前,先編譯解決方案,否則下一步會出錯誤。
下一步,為初始化遷移建立一個 DbMigration 類。這次遷移建立一個新資料庫,這也是我們為什麼要删除之前的資料庫的原因。
在“程式包管理器控制台”視窗,輸入指令 <code>add-migration Initial</code> 建立初始化遷移。名稱“Initial”是随意命名的,它用來命名建立好的遷移檔案。
Code First Migrations 建立在Migrations檔案夾中建立了一個檔案(檔案名是 {DateStamp}_Initial.cs ),這個類包含了建立資料庫結構的代碼。遷移檔案的檔案名以DateStamp開頭是為了更好的排序,打開 {DateStamp}_Initial.cs 檔案,它包含了為資料庫MovieDB建立Movies表的指令。當你使用下面的指令更新資料庫時,{DateStamp}_Initial.cs 檔案将會運作并建立資料庫結構,然後将執行 Seed 方法将測試資料插入資料庫中。
在“程式包管理器控制台”中輸入指令 <code>update-database</code> :
運作應用程式,浏覽/Movies 位址,我們在Seed方法中添加的資料如下:
上面的内容一直在介紹如何進行資料遷移,現在開始為Movie類添加Rating字段,打開Movie.cs 檔案,為它添加一個Rating字段,添加後的代碼如下:
編譯解決方案。
現在我們已經更新了Movie類,你還需要修改\Views\Movies\Index.cshtml 和 \Views\Movies\Create.cshtml 視圖。修改後的代碼如下:
修改後的Create.cshtml:
現在我們已經在程式中為Rating字段做成了修改。再次運作程式,浏覽/movies 位址,這時我們會得到一個錯誤:
出現這個錯誤的原因是Movie模型類發生了變化,而與它對應的資料表 Movie 中并不存在Rating字段。
There are a few approaches to resolving the error:
解決這個問題有以下幾種途徑:
讓Entity Framework自動删除并根據新的模型自動建立資料庫。這種方式在早起開發過程中的測試資料庫中非常友善,它可以快速的修改模型和資料庫結構。另一方面,這樣做将會使你丢失已有的資料,是以這種方式不能用在生産環境的資料庫中。
在資料庫中加上Rating字段,使資料庫和Model類的結構相同。這種方式的優點是能夠保留資料,你可以手動修改或使用資料庫腳本修改。
使用Code First 遷移來更新資料庫結構。
在本教程中,我們使用Code First 遷移。
更新Seed 方法,使它為Rating字段提供一個值。打開 Migrations\Configuration.cs 檔案,為每一個Movie對象的Rating字段指派。
修改後的Seek方法:
重新編譯解決方案,然後打開“程式包管理器控制台”,執行指令:add-migration Rating
add-migration 指令告訴遷移程式去檢查目前的Movie模型與目前資料庫之間的差異,建立遷移資料庫到最新模型的代碼。名稱 Rating 是可以随便命名的,此處用來命名遷移檔案。
當指令執行完成之後,Visual Studio 會打開剛剛添加的繼承自 DbMigration 的類檔案,檔案中有兩個方法 Up和Down,分别用來更新和降級資料庫。在Up方法中我們可以看到為資料庫添加列的代碼,而Down方法中的代碼則是删除Rating列。
編譯解決方案,然後執行指令 <code>update-database</code> 。“程式包管理器控制台”視窗的輸出如下圖(Rating前的時間戳可能不盡相同):
重新整理我們出錯的頁面,你能看到已經加入了Rating字段:
點選“Create New”連結試着添加一個電影資訊,不要忘記為Rating字段指派。
輸入完成之後點選“Create”按鈕,儲存電影資訊。
你還需要在Edit、Details和Delete視圖中添加Rating字段。
如果你再次執行 "update-database" 指令,将不會做出任何修改,因為資料庫結構和模型的結構已經相同了。
現在,通過項目中使用資料遷移,我們在添加字段或更新模型結構的時候不用再删除資料庫了。在下一節中,我們将對結構做出更多的更改,并使用資料遷移來更新資料庫。