共用方式為


將新欄位新增至電影模型和資料表

作者 :Rick Anderson

注意

本教學課程的更新版本可在此處使用 ASP.NET MVC 5 和 Visual Studio 2013。 更安全、更容易遵循並示範更多功能。

在本節中,您將使用Entity Framework Code First 移轉將一些變更移轉至模型類別,以便將變更套用至資料庫。

根據預設,當您使用 Entity Framework Code First 自動建立資料庫時,如同您稍早在本教學課程中所做的一樣,Code First 會將資料表新增至資料庫,以協助追蹤資料庫的架構是否與產生的模型類別同步。 如果它們未同步,Entity Framework 會擲回錯誤。 這可讓您更輕鬆地追蹤開發時間的問題,您可能只會在執行時間) 隱藏錯誤來尋找 (。

設定模型變更的Code First 移轉

如果您使用 Visual Studio 2012,請從 方案總管 按兩下Movies.mdf檔案,以開啟資料庫工具。 Visual Studio Express Web 會顯示 [資料庫總管],Visual Studio 2012 會顯示 [伺服器總管]。 如果您使用 Visual Studio 2010,請使用 SQL Server 物件總管。

在 [資料庫總管]、[伺服器總管] 或 [SQL Server 物件總管) ] 的資料庫 (工具中,以滑鼠右鍵按一下 MovieDBContext 並選取 [刪除] 以卸載影片資料庫。

顯示 [伺服器總管] 視窗的螢幕擷取畫面。[影片 D B 內容] 右鍵功能表中已選取 [刪除]。

流覽回方案總管。 以滑鼠右鍵按一下 Movies.mdf 檔案,然後選取 [ 刪除 ] 以移除電影資料庫。

顯示 [方案總管] 視窗的螢幕擷取畫面。在 [電影] 點 m d f 右鍵功能表中選取 [刪除]。

建置應用程式,確定沒有任何錯誤。

從 [ 工具] 功能表中,按一下 [NuGet 套件管理員 ],然後按一下 [ 套件管理員主控台]。

新增 Pack Man

在提示的 [ 套件管理員主控台] 視窗中 PM> ,輸入 「Enable-Migrations -CoNtextTypeName MvcMovie.Models.MovieDBCoNtext」。

顯示 [套件管理員主控台] 視窗的螢幕擷取畫面。輸入 [啟用移轉] 命令。

[啟用移轉] 命令 (如上所示,) 會在新的Migrations資料夾中建立Configuration.cs檔案。

顯示 [方案總管] 視窗的螢幕擷取畫面。Migrations 資料夾和組態點 c s 檔案會以紅色圓圈。

Visual Studio 會開啟 Configuration.cs 檔案。 Seed以下列程式碼取代Configuration.cs檔案中的 方法:

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 的紅色波浪線,然後選取 [ 解決 ], 然後使用MvcMovie.Models;

顯示 [影片] 右鍵功能表中已選取 [解析] 的螢幕擷取畫面。

這麼做會新增下列 using 語句:

using MvcMovie.Models;

注意

Code First 移轉 Seed 在每次移轉 (之後呼叫 方法,也就是在 Package Manager 主控台中呼叫update-database) ,而且此方法會更新已經插入的資料列,或在它們不存在時插入它們。

按 CTRL-SHIFT-B 來建置專案。 (如果您目前未建置,下列步驟將會失敗。)

下一 DbMigration 個步驟是建立初始移轉的類別。 此移轉可建立新的資料庫,這就是您在上一個步驟中刪除 movie.mdf 檔案的原因。

在 [ 套件管理員主控台] 視窗中,輸入 「add-migration Initial」 命令以建立初始移轉。 名稱 「Initial」 是任意的,用來命名所建立的移轉檔案。

顯示 [套件管理員主控台] 視窗的螢幕擷取畫面。此移轉檔案的Designer程式碼開頭的段落會反白顯示。

Code First 移轉使用名稱 {DateStamp}_Initial.cs () Migrations資料夾中建立另一個類別檔案,而此類別包含建立資料庫架構的程式碼。 移轉檔案名會預先修正時間戳記,以協助排序。 檢查 {DateStamp}_Initial.cs 檔案,其中包含建立 Movie DB 的 Movies 資料表的指示。 當您在下列指示中更新資料庫時,這個 {DateStamp}_Initial.cs 檔案將會執行並建立資料庫架構。 然後 ,Seed 方法會執行 以填入 DB 的測試資料。

套件管理員主控台中,輸入 「update-database」 命令以建立資料庫並執行 Seed 方法。

顯示 [套件管理員主控台] 視窗的螢幕擷取畫面。系統會輸入更新資料庫命令。

如果您收到指出資料表已存在且無法建立的錯誤,可能是因為您在刪除資料庫之後執行應用程式,以及在執行 之前執行 update-database 。 在此情況下,請再次刪除 Movies.mdf 檔案,然後重試 update-database 命令。 如果您仍然收到錯誤,請刪除移轉資料夾和內容,然後從此頁面頂端的指示開始, (刪除 Movies.mdf 檔案,然後繼續進行 Enable-Migrations) 。

執行應用程式並流覽至 /Movies URL。 會顯示種子資料。

顯示具有四部電影清單之 M V C 影片索引頁面的螢幕擷取畫面。

將 Rating 屬性新增至電影模型

首先,將新的 Rating 屬性新增至現有的 Movie 類別。 開啟 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; }
}

使用 [建置影片]功能表命令或按 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 檔案,並在表單結尾附近新增下列標記。 這會轉譯文字方塊,以便您可以在建立新電影時指定評等。

<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。 不過,當您這樣做時,您會看到下列其中一個錯誤:

顯示使用者程式碼未處理錯誤無效作業例外狀況的螢幕擷取畫面。

顯示瀏覽器視窗的螢幕擷取畫面,其中顯示指出應用程式中伺服器錯誤的錯誤。

您看到此錯誤是因為應用程式中更新 Movie 的模型類別現在與現有資料庫的資料表架構 Movie 不同。 (資料庫資料表中沒有任何 Rating 資料行)。

有幾個方法可以解決這個錯誤:

  1. 讓 Entity Framework 自動卸除資料庫,並重新依據新的模型類別結構描述來建立資料庫。 在測試資料庫上執行主動式開發時,此方法非常方便;它可讓您快速發展模型和資料庫架構。 不過,缺點是您遺失資料庫中的現有資料,因此 您不想 在生產資料庫上使用此方法! 使用初始化運算式自動植入具有測試資料的資料庫,通常是開發應用程式的生產力方式。 如需 Entity Framework 資料庫初始化運算式的詳細資訊,請參閱 Tom Dykstra 的 ASP.NET MVC/Entity Framework 教學課程
  2. 您可明確修改現有資料庫的結構描述,使其符合模型類別。 這種方法的優點是可以保留您的資料。 您可以手動方式或藉由建立資料庫變更指令碼來進行這項變更。
  3. 使用 Code First 移轉來更新資料庫結構描述。

在本教學課程中,我們將使用 Code First 移轉。

更新 Seed 方法,讓它提供新資料行的值。 開啟 Migrations\Configuration.cs 檔案,並將 Rating 欄位新增至每個 Movie 物件。

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

建置方案,然後開啟 [ 套件管理員主控台] 視窗,然後輸入下列命令:

add-migration AddRatingMig

命令 add-migration 會告訴移轉架構使用目前的電影 DB 架構檢查目前的電影模型,並建立必要的程式碼,以將資料庫移轉至新的模型。 AddRatingMig 是任意的,用來命名移轉檔案。 使用有意義的移轉步驟名稱會很有説明。

當此命令完成時,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");
    }
}

建置方案,然後在 [ 套件管理員主控台 ] 視窗中輸入 「update-database」 命令。

下圖顯示 [套件管理員主控台 ] 視窗中的輸出, (AddRatingMig 之前的日期戳記將會不同。)

顯示更新資料庫命令的螢幕擷取畫面。

重新執行應用程式並流覽至 /Movies URL。 您可以看到新的 [評等] 欄位。

顯示已列出四部電影之 M V C 影片索引頁面的螢幕擷取畫面。

按一下 [ 新建] 連結以新增電影。 請注意,您可以新增評等。

7_CreateRioII

按一下 [建立]。 新的電影,包括評分,現在會顯示在電影清單中:

7_ourNewMovie_SM

您也應該將 Rating 欄位新增至 [編輯]、[詳細資料] 和 [SearchIndex] 檢視範本。

您可以在 [ 套件管理員主控台 ] 視窗中再次輸入 「update-database」 命令,而且不會進行任何變更,因為架構符合模型。

在本節中,您已瞭解如何修改模型物件,並讓資料庫與變更保持同步。 您也已瞭解如何使用範例資料填入新建立的資料庫,以便試用案例。 接下來,讓我們看看如何將更豐富的驗證邏輯新增至模型類別,並強制執行一些商務規則。