在本節(jié)中,您將使用Entity Framework Code First來(lái)實(shí)現(xiàn)模型類上的操作。從而使得這些操作和變更,可以應(yīng)用到數(shù)據(jù)庫(kù)中。
默認(rèn)情況下,就像您在之前的教程中所作的那樣,使用 Entity Framework Code First自動(dòng)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),Code First為數(shù)據(jù)庫(kù)所添加的表,將幫助您跟蹤數(shù)據(jù)庫(kù)是否和從它生成的模型類是同步的。如果他們不是同步的,Entity Framework將拋出一個(gè)錯(cuò)誤。這非常方便的在開(kāi)發(fā)時(shí)就可以發(fā)現(xiàn)錯(cuò)誤,否則您可能會(huì)在運(yùn)行時(shí)才發(fā)現(xiàn)這個(gè)問(wèn)題。 (由一個(gè)晦澀的錯(cuò)誤信息,才發(fā)現(xiàn)這個(gè)問(wèn)題。)
為對(duì)象模型的變更設(shè)置 Code First Migrations
如果您使用的是 Visual Studio 2012,從解決方案資源管理器中雙擊Movies.mdf,打開(kāi)數(shù)據(jù)庫(kù)工具。Visual Studio Express for Web將顯示數(shù)據(jù)庫(kù)資源管理器,Visual Studio 2012 將顯示服務(wù)器資源管理器。如果您使用的是Visual Studio 2010,請(qǐng)使用 SQL Server對(duì)象資源管理器。
在數(shù)據(jù)庫(kù)工具 (數(shù)據(jù)庫(kù)資源管理器、 服務(wù)器資源管理器或 SQL Server對(duì)象資源管理器),右鍵單擊MovieDBContext ,并選擇刪除以刪除電影數(shù)據(jù)庫(kù)。
返回到解決方案資源管理器。在Movies.mdf文件上右鍵單擊,并選擇刪除以刪除電影數(shù)據(jù)庫(kù)。
Build應(yīng)用程序,以確保沒(méi)有任何編譯錯(cuò)誤。
從工具菜單上,單擊庫(kù)包管理器,然后點(diǎn)擊程序包管理器控制臺(tái).
在 軟件包管理器控制臺(tái) 窗口中 PM> 提示符下輸入"Enable-Migrations –ContextTypeName MvcMovie.Models.MovieDBContext"。
(如上所示)Enable-Migrations命令會(huì)在Migrations文件夾中創(chuàng)建一個(gè)Configuration.cs文件。
在Visual Studio 中打開(kāi)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下面出現(xiàn)的紅色波浪線上右鍵單擊,并選擇Resolve然后點(diǎn)擊using MvcMovie.Models;
這樣做之后,將添加以下的 using語(yǔ)句:
using MvcMovie.Models;
每次Code First Migrations 會(huì)調(diào)用Seed 方法(即,在程序包管理器控制臺(tái)中調(diào)用update-database),并且此次調(diào)用會(huì)更新行:更新已經(jīng)插入的行,或把不存在的行也插入。
按 CTRL-SHIFT-B 來(lái)Build工程。(如果此次Build不成功,以下的步驟將會(huì)失敗。)
下一步是創(chuàng)建一個(gè)DbMigration類,用于初始化數(shù)據(jù)庫(kù)遷移。此遷移類將創(chuàng)建新的數(shù)據(jù)庫(kù),這也就是為什么在之前的步驟中你要?jiǎng)h除movie.mdf文件。
在軟件包管理器控制臺(tái)窗口中,輸入"add-migration Initial"命令來(lái)創(chuàng)建初始遷移。" Initial" 的名稱是任意,是用于創(chuàng)建遷移文件的名稱。
Code First Migrations將會(huì)在Migrations文件夾中創(chuàng)建另一個(gè)類文件 (文件名為: {DateStamp}_Initial.cs ),此類中包含的代碼將創(chuàng)建數(shù)據(jù)庫(kù)的Schema。遷移文件名使用時(shí)間戳作為前綴,以幫助用來(lái)排序和查找。查看{DateStamp}_Initial.cs文件,它包含了為電影數(shù)據(jù)庫(kù)創(chuàng)建電影表的說(shuō)明。當(dāng)您更新數(shù)據(jù)庫(kù)時(shí),{DateStamp}_Initial.cs文件將會(huì)被運(yùn)行并創(chuàng)建 DB 的Schema。然后Seed方法將運(yùn)行,用來(lái)填充 DB 的測(cè)試數(shù)據(jù)。
在軟件包管理器控制臺(tái)中,輸入命令" update-database ",創(chuàng)建數(shù)據(jù)庫(kù)并運(yùn)行Seed方法。
如果您收到表已經(jīng)存在并且無(wú)法創(chuàng)建的錯(cuò)誤,可能是因?yàn)槟呀?jīng)刪除了數(shù)據(jù)庫(kù),并且在執(zhí)行update-database之前,您運(yùn)行了應(yīng)用程序。在這種情況下,再次刪除Movies.mdf文件,然后重試update-database命令。如果您仍遇到錯(cuò)誤,刪除Migration文件夾及其內(nèi)容,然后從頭開(kāi)始重做。(即刪除Movies.mdf文件,然后再進(jìn)行Enable-Migrations)
運(yùn)行該應(yīng)用程序,然后瀏覽URL /Movies Seed數(shù)據(jù)顯示如下:
為影片模型添加評(píng)級(jí)屬性
給現(xiàn)有的Movie類,添加新的Rating屬性。打開(kāi)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 應(yīng)用程序 Build>Build Move或CTRL-SHIFT-B.
現(xiàn)在,您已經(jīng)更新了Model類,您還需要更新\Views\Movies\Index.cshtml和\Views\Movies\Create.cshtml視圖模板,以便能在瀏覽器中顯示新的Rating屬性。
打開(kāi)\Views\Movies\Index.cshtml文件,在Price列后面添加<th>Rating</th>的列頭。然后添加一個(gè)<td>列來(lái)顯示@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>
下一步,打開(kāi)\Views\Movies\Create.cshtml文件,并在form標(biāo)簽結(jié)束處的附近添加如下代碼。您可以在創(chuàng)建新的電影時(shí)指定一個(gè)電影等級(jí)。
<div > @Html.LabelFor(model => model.Rating) </div> <div > @Html.EditorFor(model => model.Rating) @Html.ValidationMessageFor(model => model.Rating) </div>
現(xiàn)在,您已經(jīng)更新應(yīng)用程序代碼以支持了新的Rating屬性。
現(xiàn)在運(yùn)行該應(yīng)用程序,然后瀏覽 /Movies的 URL。然而,當(dāng)您這樣做時(shí),您將看到以下之一的錯(cuò)誤信息:
你現(xiàn)在看到此錯(cuò)誤,因?yàn)樵趹?yīng)用程序中,最新的Movie模型類和現(xiàn)有的數(shù)據(jù)庫(kù)Movie表的Schema不同。(數(shù)據(jù)庫(kù)表中,沒(méi)有Rating列。)
我們將使用Code First Migrations 來(lái)解決這一問(wèn)題。
更新Seed方法,以便它能為新的列提供一個(gè)值。打開(kāi) Migrations\Configuration.cs 文件,并將Rating 字段添加到影片的每個(gè)對(duì)象。
new Movie { Title = "When Harry Met Sally", ReleaseDate = DateTime.Parse("1989-1-11"), Genre = "Romantic Comedy", Rating = "G", Price = 7.99M },
Build解決方案,然后打開(kāi) 軟件包管理器控制臺(tái) 窗口,并輸入以下命令:
add-migration AddRatingMig
add-migration命令告訴migration framework,來(lái)檢查當(dāng)前電影模型與當(dāng)前的影片 DB Schema并創(chuàng)建必要的代碼以將數(shù)據(jù)庫(kù)遷移到新的模型。AddRatingMig 是一個(gè)任意的文件名參數(shù),用于命名migration文件。它將有助于使得遷移步驟成為一個(gè)有意義的名字。
當(dāng)命令完成后,用Visual Studio 打開(kāi)類文件,新繼承自DbMIgration 類的定義,并在Up 方法中,您可以看到創(chuàng)建新列的代碼:
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解決方案,然后在 程序包管理器控制臺(tái) 窗口中輸入"update-database"命令。
下面的圖片顯示了 程序包管理器控制臺(tái) 窗口的輸出 (AddRatingMig 的前綴時(shí)間戳將有所不同)。
重新運(yùn)行應(yīng)用程序,然后瀏覽 /Movies 的 URL。您可以看到新的評(píng)級(jí)字段。
單擊CreateNew鏈接來(lái)添加一部新電影。注意,請(qǐng)您可以為電影添加評(píng)級(jí)。
單擊Create。新的電影,包括評(píng)級(jí),將顯示在電影列表中:
此外您也應(yīng)該把Rating 字段添加到編輯、 詳細(xì)信息和 SearchIndex 的視圖模板中。
您可以再次在 程序包管理器控制臺(tái) 窗口中輸入"update-database"命令,將不會(huì)有任何新的變化,因?yàn)閿?shù)據(jù)庫(kù)Schema 和模型類現(xiàn)在是匹配的。
在本節(jié)中,您看到了如何修改模型對(duì)象并始終保持其和數(shù)據(jù)庫(kù)Schema的同步。您還學(xué)習(xí)了使用填充示例數(shù)據(jù)來(lái)創(chuàng)建新數(shù)據(jù)庫(kù)的例子,您可以反復(fù)嘗試。接下來(lái),讓我們看看如何將豐富的驗(yàn)證邏輯添加到模型類,并對(duì)模型類執(zhí)行一些強(qiáng)制的業(yè)務(wù)規(guī)則驗(yàn)證。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com