天天看點

【譯】ASP.NET MVC 5 教程 - 9:添加新字段

在本節中,我們将使用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" 指令,将不會做出任何修改,因為資料庫結構和模型的結構已經相同了。

現在,通過項目中使用資料遷移,我們在添加字段或更新模型結構的時候不用再删除資料庫了。在下一節中,我們将對結構做出更多的更改,并使用資料遷移來更新資料庫。