1. 程式人生 > >Asp.Net MVC4入門指南(7):給電影表和模型新增新欄位

Asp.Net MVC4入門指南(7):給電影表和模型新增新欄位

在本節中,您將使用Entity Framework Code First來實現模型類上的操作。從而使得這些操作和變更,可以應用到資料庫中。

預設情況下,就像您在之前的教程中所作的那樣,使用 Entity Framework Code First自動建立一個數據庫,Code First為資料庫所新增的表,將幫助您跟蹤資料庫是否和從它生成的模型類是同步的。如果他們不是同步的,Entity Framework將丟擲一個錯誤。這非常方便的在開發時就可以發現錯誤,否則您可能會在執行時才發現這個問題。 (由一個晦澀的錯誤資訊,才發現這個問題。)

為物件模型的變更設定 Code First Migrations

如果您使用的是 Visual Studio 2012,從解決方案資源管理器中雙擊Movies.mdf,開啟資料庫工具。Visual Studio Express for Web將顯示資料庫資源管理器,Visual Studio 2012 將顯示伺服器資源管理器。如果您使用的是Visual Studio 2010,請使用 SQL Server物件資源管理器。

在資料庫工具 (資料庫資源管理器、 伺服器資源管理器或 SQL Server物件資源管理器),右鍵單擊MovieDBContext ,並選擇刪除以刪除電影資料庫。

clip_image001

返回到解決方案資源管理器。在Movies.mdf檔案上右鍵單擊,並選擇刪除

以刪除電影資料庫。

clip_image002

Build應用程式,以確保沒有任何編譯錯誤。

工具選單上,單擊庫包管理器,然後點選程式包管理器控制檯.

clip_image003

軟體包管理器控制檯 視窗中PM> 提示符下輸入"Enable-Migrations –ContextTypeName MvcMovie.Models.MovieDBContext"。

clip_image004

(如上所示)Enable-Migrations命令會在Migrations資料夾中建立一個Configuration.cs檔案。

clip_image005

在Visual Studio 中開啟Configuration.cs檔案。把Configuration.cs檔案中的Seed方法,替換為下面的程式碼:

protected override void Seed(MvcMovie.Models.MovieDBContext context) { context.Movies.AddOrUpdate( i => i.Title, new Movie { Title = "When Harry Met Sally", ReleaseDate = DateTime.Parse("1989-1-11"), Genre = "Romantic Comedy", Price = 7.99M }, new Movie { Title = "Ghostbusters ", ReleaseDate = DateTime.Parse("1984-3-13"), Genre = "Comedy", Price = 8.99M }, new Movie { Title = "Ghostbusters 2", ReleaseDate = DateTime.Parse("1986-2-23"), Genre = "Comedy", Price = 9.99M }, new Movie { Title = "Rio Bravo", ReleaseDate = DateTime.Parse("1959-4-15"), Genre = "Western", Price = 3.99M } ); }

在Movie下面出現的紅色波浪線上右鍵單擊,並選擇Resolve然後點選using MvcMovie.Models

clip_image006

這樣做之後,將新增以下的 using語句:

using MvcMovie.Models;

每次Code First Migrations 會呼叫Seed 方法(即,在程式包管理器控制檯中呼叫update-database),並且此次呼叫會更新行:更新已經插入的行,或把不存在的行也插入。

CTRL-SHIFT-B Build工程。(如果此次Build不成功,以下的步驟將會失敗。)

下一步是建立一個DbMigration類,用於初始化資料庫遷移。此遷移類將建立新的資料庫,這也就是為什麼在之前的步驟中你要刪除movie.mdf檔案。

軟體包管理器控制檯視窗中,輸入"add-migration Initial"命令來建立初始遷移。" Initial" 的名稱是任意,是用於建立遷移檔案的名稱。

clip_image007

Code First Migrations將會在Migrations資料夾中建立另一個類檔案 (檔名為: {DateStamp}_Initial.cs ),此類中包含的程式碼將建立資料庫的Schema。遷移檔名使用時間戳作為字首,以幫助用來排序和查詢。檢視{DateStamp}_Initial.cs檔案,它包含了為電影資料庫建立電影表的說明。當您更新資料庫時,{DateStamp}_Initial.cs檔案將會被執行並建立 DB 的Schema。然後Seed方法將執行,用來填充 DB 的測試資料。

軟體包管理器控制檯中,輸入命令" update-database ",建立資料庫並執行Seed方法。

clip_image008

如果您收到表已經存在並且無法建立的錯誤,可能是因為您已經刪除了資料庫,並且在執行update-database之前,您運行了應用程式。在這種情況下,再次刪除Movies.mdf檔案,然後重試update-database命令。如果您仍遇到錯誤,刪除Migration資料夾及其內容,然後從頭開始重做。(即刪除Movies.mdf檔案,然後再進行Enable-Migrations)

執行該應用程式,然後瀏覽URL /Movies Seed資料顯示如下:

clip_image009

為影片模型新增評級屬性

給現有的Movie類,新增新的Rating屬性。開啟Models\Movie.cs檔案並新增如下Rating屬性:

public string Rating { get; set; }

完整的Movie類如下:

public class Movie { public int ID { get; set; } public string Title { get; set; } public DateTime ReleaseDate { get; set; } public string Genre { get; set; } public decimal Price { get; set; } public string Rating { get; set; } }

Build 應用程式 Build>Build Move或CTRL-SHIFT-B.

現在,您已經更新了Model類,您還需要更新\Views\Movies\Index.cshtml\Views\Movies\Create.cshtml檢視模板,以便能在瀏覽器中顯示新的Rating屬性。

開啟\Views\Movies\Index.cshtml檔案,在Price列後面新增<th>Rating</th>的列頭。然後新增一個<td>列來顯示@item.Rating的值。下面是更新的Index.cshtml檢視模板:

@model IEnumerable<MvcMovie.Models.Movie> @{ ViewBag.Title = "Index"; } <h2>Index</h2> <p> @Html.ActionLink("Create New", "Create") </p> <table> <tr> <th> @Html.DisplayNameFor(model => model.Title) </th> <th> @Html.DisplayNameFor(model => model.ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Genre) </th> <th> @Html.DisplayNameFor(model => model.Price) </th> <th> @Html.DisplayNameFor(model => model.Rating) </th> <th></th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Title) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Genre) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Rating) </td> <td> @Html.ActionLink("Edit", "Edit", new { id=item.ID }) | @Html.ActionLink("Details", "Details", new { id=item.ID }) | @Html.ActionLink("Delete", "Delete", new { id=item.ID }) </td> </tr> } </table>

下一步,開啟\Views\Movies\Create.cshtml檔案,並在form標籤結束處的附近新增如下程式碼。您可以在建立新的電影時指定一個電影等級。

<div class="editor-label"> @Html.LabelFor(model => model.Rating) </div> <div class="editor-field"> @Html.EditorFor(model => model.Rating) @Html.ValidationMessageFor(model => model.Rating) </div>

現在,您已經更新應用程式程式碼以支援了新的Rating屬性。

現在執行該應用程式,然後瀏覽 /Movies的 URL。然而,當您這樣做時,您將看到以下之一的錯誤資訊:

clip_image010

clip_image011

你現在看到此錯誤,因為在應用程式中,最新的Movie模型類和現有的資料庫Movie表的Schema不同。(資料庫表中,沒有Rating列。)

我們將使用Code First Migrations 來解決這一問題。

更新Seed方法,以便它能為新的列提供一個值。開啟 Migrations\Configuration.cs 檔案,並將Rating 欄位新增到影片的每個物件。

new Movie
         {
             Title = "When Harry Met Sally",
             ReleaseDate = DateTime.Parse("1989-1-11"),
             Genre = "Romantic Comedy",
             Rating = "G",
             Price = 7.99M
         },

Build解決方案,然後開啟 軟體包管理器控制檯 視窗,並輸入以下命令:

add-migration AddRatingMig

add-migration命令告訴migration framework,來檢查當前電影模型與當前的影片 DB Schema並建立必要的程式碼以將資料庫遷移到新的模型。AddRatingMig 是一個任意的檔名引數,用於命名migration檔案。它將有助於使得遷移步驟成為一個有意義的名字。

當命令完成後,用Visual Studio 開啟類檔案,新繼承自DbMIgration 類的定義,並在Up 方法中,您可以看到建立新列的程式碼:

public partial class AddRatingMig : DbMigration { public override void Up() { AddColumn("dbo.Movies", "Rating", c => c.String()); } public override void Down() { DropColumn("dbo.Movies", "Rating"); } }

Build解決方案,然後在 程式包管理器控制檯 視窗中輸入"update-database"命令。

下面的圖片顯示了 程式包管理器控制檯 視窗的輸出 (AddRatingMig 的字首時間戳將有所不同)。

clip_image012

重新執行應用程式,然後瀏覽 /Movies 的 URL。您可以看到新的評級欄位。

clip_image013

單擊CreateNew連結來新增一部新電影。注意,請您可以為電影新增評級。

clip_image014

單擊Create。新的電影,包括評級,將顯示在電影列表中:

clip_image015

此外您也應該把Rating 欄位新增到編輯、 詳細資訊和 SearchIndex 的檢視模板中。

您可以再次在 程式包管理器控制檯 視窗中輸入"update-database"命令,將不會有任何新的變化,因為資料庫Schema 和模型類現在是匹配的。

在本節中,您看到了如何修改模型物件並始終保持其和資料庫Schema的同步。您還學習了使用填充示例資料來建立新資料庫的例子,您可以反覆嘗試。接下來,讓我們看看如何將豐富的驗證邏輯新增到模型類,並對模型類執行一些強制的業務規則驗證。相信有了本節如何修改模型物件並始終保持其和資料庫Schema同步的內容介紹,大家會對MVC的理解又加深一步。後面如果要進行ASP.ET MVC的開發,在具備MVC的知識的同時,還可以藉助一些開發工具。使用 ComponentOne Studio ASP.NET MVC 這款輕量級控制元件,可以助力你的MVC開發過程。

--------------------------------------------------------------------------------------------------------------------

譯者注:

本系列共9篇文章,翻譯自Asp.Net MVC4 官方教程,由於本系列文章言簡意賅,篇幅適中,從一個示例開始講解,全文最終完成了一個管理影片的小系統,非常適合新手入門Asp.Net MVC4,並由此開始開發工作。9篇文章為:

1. Asp.Net MVC4 入門介紹

2. 新增一個控制器

3. 新增一個檢視

4. 新增一個模型

5. 從控制器訪問資料模型

6. 驗證編輯方法和編輯檢視

7. 給電影表和模型新增新欄位

8. 給資料模型新增校驗器

9. 查詢詳細資訊和刪除記錄

 10.第三方控制元件Studio for ASP.NET Wijmo MVC4 工具應用

相關閱讀: