天天看點

Asp.Net MVC4入門指南(7):給電影表和模型添加新字段為對象模型的變更設定 Code First Migrations為影片模型添加評級屬性

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

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

如果您使用的是 Visual Studio 2012,從解決方案資料總管中輕按兩下Movies.mdf,打開資料庫工具。Visual Studio Express for Web将顯示資料庫資料總管,Visual Studio 2012 将顯示伺服器資料總管。如果您使用的是Visual Studio 2010,請使用 SQL Server對象資料總管。

在資料庫工具 (資料庫資料總管、 伺服器資料總管或 SQL Server對象資料總管),右鍵單擊<code>MovieDBContext </code>,并選擇删除以删除電影資料庫。

<a href="http://powertoolsteam.blog.51cto.com/attachment/201302/26/2369428_1361846775w0J9.png"></a>

傳回到解決方案資料總管。在Movies.mdf檔案上右鍵單擊,并選擇删除以删除電影資料庫。

<a href="http://powertoolsteam.blog.51cto.com/attachment/201302/26/2369428_1361846777mTyf.png"></a>

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

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

<a href="http://powertoolsteam.blog.51cto.com/attachment/201302/26/2369428_1361846779uv78.png"></a>

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

<a href="http://powertoolsteam.blog.51cto.com/attachment/201302/26/2369428_1361846781LXil.png"></a>

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

<a href="http://powertoolsteam.blog.51cto.com/attachment/201302/26/2369428_1361846783NrsL.png"></a>

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

<a href="http://blog.51cto.com/powertoolsteam/1140334#">?</a>

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

<a href="http://powertoolsteam.blog.51cto.com/attachment/201302/26/2369428_13618467852mqp.png"></a>

這樣做之後,将添加以下的 using語句:

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

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

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

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

<a href="http://powertoolsteam.blog.51cto.com/attachment/201302/26/2369428_1361846788JI39.png"></a>

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

在軟體包管理器控制台中,輸入指令" update-database ",建立資料庫并運作Seed方法。

<a href="http://powertoolsteam.blog.51cto.com/attachment/201302/26/2369428_1361846791ULhn.png"></a>

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

運作該應用程式,然後浏覽URL /Movies Seed資料顯示如下:

<a href="http://powertoolsteam.blog.51cto.com/attachment/201302/26/2369428_1361846794DkFb.png"></a>

給現有的<code>Movie</code>類,添加新的<code>Rating</code>屬性。打開Models\Movie.cs檔案并添加如下<code>Rating</code>屬性:

完整的<code>Movie</code>類如下:

Build 應用程式 Build&gt;Build Move或CTRL-SHIFT-B.

現在,您已經更新了<code>Model</code>類,您還需要更新\Views\Movies\Index.cshtml和\Views\Movies\Create.cshtml視圖模闆,以便能在浏覽器中顯示新的<code>Rating</code>屬性。

打開\Views\Movies\Index.cshtml檔案,在Price列後面添加<code>&lt;th&gt;Rating&lt;/th&gt;</code>的列頭。然後添加一個<code>&lt;td&gt;</code>列來顯示<code>@item.Rating</code>的值。下面是更新的Index.cshtml視圖模闆:

下一步,打開\Views\Movies\Create.cshtml檔案,并在form标簽結束處的附近添加如下代碼。您可以在建立新的電影時指定一個電影等級。

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

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

<a href="http://powertoolsteam.blog.51cto.com/attachment/201302/26/2369428_1361846797MhBM.png"></a>

<a href="http://powertoolsteam.blog.51cto.com/attachment/201302/26/2369428_13618468033Uuo.png"></a>

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

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

更新Seed方法,以便它能為新的列提供一個值。打開 Migrations\Configuration.cs 檔案,并将Rating 字段添加到影片的每個對象。

Build解決方案,然後打開 軟體包管理器控制台 視窗,并輸入以下指令:

<code>add-migration AddRatingMig</code>

<code>add-migration</code>指令告訴migration framework,來檢查目前電影模型與目前的影片 DB Schema并建立必要的代碼以将資料庫遷移到新的模型。AddRatingMig 是一個任意的檔案名參數,用于命名migration檔案。它将有助于使得遷移步驟成為一個有意義的名字。

當指令完成後,用Visual Studio 打開類檔案,新繼承自<code>DbMIgration</code> 類的定義,并在<code>Up</code> 方法中,您可以看到建立新列的代碼:

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

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

<a href="http://powertoolsteam.blog.51cto.com/attachment/201302/26/2369428_1361846806k9cm.png"></a>

重新運作應用程式,然後浏覽 /Movies 的 URL。您可以看到新的評級字段。

<a href="http://powertoolsteam.blog.51cto.com/attachment/201302/26/2369428_1361846808NGSL.png"></a>

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

<a href="http://powertoolsteam.blog.51cto.com/attachment/201302/26/2369428_1361846810alj8.png"></a>

單擊Create。新的電影,包括評級,将顯示在電影清單中:

<a href="http://powertoolsteam.blog.51cto.com/attachment/201302/26/2369428_1361846816jLFS.png"></a>

此外您也應該把<code>Rating</code> 字段添加到編輯、 詳細資訊和 SearchIndex 的視圖模闆中。

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

本文轉自 powertoolsteam 51CTO部落格,原文連結:http://blog.51cto.com/powertoolsteam/1140334,如需轉載請自行聯系原作者