原文 Adding a New Field
作者 Rick Anderson
翻譯 謝煬(Kiler)
校對 許登洋(Seay)、高嵩(Jack)
在這個章節你將使用 Entity Framework Code First 遷移模型中新加的字段,從而將模型字段變更同步到數據庫。
當你使用 EF Code First 模式自動創建一個數據庫,Code First 模式添加到數據庫的表將幫助你來跟蹤數據庫的數據結構是否和從它生成的模型類是同步的。如果不同步,EF 會拋出異常。這將有助於你在開發階段就發現錯誤,否則可能要到運行時才能發現這個錯誤了(通過一個很隱蔽的錯誤信息)。
添加一個 Rating 字段到 Movie 模型
打開 Models/Movie.cs 文件,添加一個 Rating 屬性:
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
[Display(Name = "Release Date")]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
public string Rating { get; set; } //手動高亮
}
生成應用程序(Ctrl+Shift+B)。
因為你已經在 Movie 類添加了一個新的字段,你還需要更新綁定的白名單,這樣這個新的屬性將包括在內。為了 Create 和 Edit action 方法包含 Rating 屬性需要更新 [Bind] 特性:
[Bind("ID,Title,ReleaseDate,Genre,Price,Rating")]
為了把這個字段顯示出來你必須更新視圖,在瀏覽器視圖中創建或者編輯一個新的 Rating 屬性。
編輯 /Views/Movies/Index.cshtml 文件並添加一個 Rating 字段:
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.movies[0].Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.movies[0].Price)
</th>
<th>
@Html.DisplayNameFor(model => model.movies[0].ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.movies[0].Title)
</th>
<th>
@Html.DisplayNameFor(model => model.movies[0].Rating) <!--手工高亮-->
</th>
<th></th>
</tr>
<tbody>
@foreach (var item in Model.movies)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Rating) <!--手工高亮-->
</td>
更新 /Views/Movies/Create.cshtml 文件添加 Rating 字段。你可以從上一個 form group 拷貝/粘帖以便於讓智能感知幫助你更新字段。智能感知參考 Tag Helpers。

應用程序無法工作,直到我們更新了數據庫包含新的字段。如果你現在運行程序,你將得到下面的 SqlException :

你看到這個錯誤是因為更新過的 Movie 模型類與數據庫中存在的 Movie 的結構是不同的。(數據庫表中沒有 Rating 列)
有以下幾種方法解決這個錯誤:
-
Entity Framework 可以基於新的模型類自動刪除並重建數據庫結構。在開發環節的早期階段,當你在測試數據庫上積極做開發的時候,這種方式是非常方便的;它可以同時讓你快速地更新模型類和數據庫結構。但是,缺點是你會丟失數據庫中的現有的數據 —— 因此你不想在生產數據庫中使用這種方法!使用初始化器自動完成數據庫的初始化並填充測試數據,往往是開發應用程序的一個有效方式。
-
顯式修改現有數據庫的結構使得它與模型類相匹配。這種方法的好處是,你可以保留錄入過的數據。你可以手動修改或通過執行一個自動創建的數據庫更改腳本進行變更。
-
采用 Code First 遷移來更新數據庫結構。
對於本教程,我們采用 Code First 遷移。
更新 SeedData 類以便於為新的的字段提供填充值。下面展示一個變更的例子,但是你可能希望將這個變更應用到每個 new Movie。
new Movie
{
Title = "When Harry Met Sally",
ReleaseDate = DateTime.Parse("1989-1-11"),
Genre = "Romantic Comedy",
Rating = "R", //手動高亮
Price = 7.99M
},
生成解決方案,然后打開命令提示符。輸入以下命令:
dotnet ef migrations add Rating
dotnet ef database update
migrations add 命令通知數據庫遷移框架檢查 Movie 模型是否與當前 Movie 數據庫表結構一致,如果不一致,就會創建新的必要的代碼把數據庫遷移到新的模型。“Rating” 名字可以是任意的,只是用於遷移文件。對於遷移操作采用有意義的名字是有幫助的。
如果在數據庫中刪除所有記錄,數據庫將會被初始化並添加 Rating 字段。你可以在瀏覽器或者 SSOX ( 即SQL Server Object Explorer(SQL Server對象資源管理器),譯者注)中點擊刪除鏈接。
運行應用程序並驗證你可以用 Rating 字段 create/edit/display 電影。你還應該將 Rating 字段添加到 Edit、Details 和 Delete 視圖模板中。
