在本節(jié)中,您將使用Entity Framework Code First來實(shí)現(xiàn)模型類上的操作。從而使得這些操作和變更,可以應(yīng)用到數(shù)據(jù)庫中。
默認(rèn)情況下,就像您在之前的教程中所作的那樣,使用 Entity Framework Code First自動創(chuàng)建一個(gè)數(shù)據(jù)庫,Code First為數(shù)據(jù)庫所添加的表,將幫助您跟蹤數(shù)據(jù)庫是否和從它生成的模型類是同步的。如果他們不是同步的,Entity Framework將拋出一個(gè)錯(cuò)誤。這非常方便的在開發(fā)時(shí)就可以發(fā)現(xiàn)錯(cuò)誤,否則您可能會在運(yùn)行時(shí)才發(fā)現(xiàn)這個(gè)問題。 (由一個(gè)晦澀的錯(cuò)誤信息,才發(fā)現(xiàn)這個(gè)問題。)
為對象模型的變更設(shè)置 Code First Migrations
如果您使用的是 Visual Studio 2012,從解決方案資源管理器中雙擊Movies.mdf,打開數(shù)據(jù)庫工具。Visual Studio Express for Web將顯示數(shù)據(jù)庫資源管理器,Visual Studio 2012 將顯示服務(wù)器資源管理器。如果您使用的是Visual Studio 2010,請使用 SQL Server對象資源管理器。
在數(shù)據(jù)庫工具 (數(shù)據(jù)庫資源管理器、 服務(wù)器資源管理器或 SQL Server對象資源管理器),右鍵單擊MovieDBContext ,并選擇刪除以刪除電影數(shù)據(jù)庫。
返回到解決方案資源管理器。在Movies.mdf文件上右鍵單擊,并選擇刪除以刪除電影數(shù)據(jù)庫。
Build應(yīng)用程序,以確保沒有任何編譯錯(cuò)誤。
從工具菜單上,單擊庫包管理器,然后點(diǎn)擊程序包管理器控制臺.
在 軟件包管理器控制臺 窗口中 PM> 提示符下輸入"Enable-Migrations –ContextTypeName MvcMovie.Models.MovieDBContext"。
(如上所示)Enable-Migrations命令會在Migrations文件夾中創(chuàng)建一個(gè)Configuration.cs文件。
在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下面出現(xiàn)的紅色波浪線上右鍵單擊,并選擇Resolve然后點(diǎn)擊using MvcMovie.Models;
這樣做之后,將添加以下的 using語句:
每次Code First Migrations 會調(diào)用Seed 方法(即,在程序包管理器控制臺中調(diào)用update-database),并且此次調(diào)用會更新行:更新已經(jīng)插入的行,或把不存在的行也插入。
按 CTRL-SHIFT-B 來Build工程。(如果此次Build不成功,以下的步驟將會失敗。)
下一步是創(chuàng)建一個(gè)DbMigration類,用于初始化數(shù)據(jù)庫遷移。此遷移類將創(chuàng)建新的數(shù)據(jù)庫,這也就是為什么在之前的步驟中你要?jiǎng)h除movie.mdf文件。
在軟件包管理器控制臺窗口中,輸入"add-migration Initial"命令來創(chuàng)建初始遷移。" Initial" 的名稱是任意,是用于創(chuàng)建遷移文件的名稱。
Code First Migrations將會在Migrations文件夾中創(chuàng)建另一個(gè)類文件 (文件名為: {DateStamp}_Initial.cs ),此類中包含的代碼將創(chuàng)建數(shù)據(jù)庫的Schema。遷移文件名使用時(shí)間戳作為前綴,以幫助用來排序和查找。查看{DateStamp}_Initial.cs文件,它包含了為電影數(shù)據(jù)庫創(chuàng)建電影表的說明。當(dāng)您更新數(shù)據(jù)庫時(shí),{DateStamp}_Initial.cs文件將會被運(yùn)行并創(chuàng)建 DB 的Schema。然后Seed方法將運(yùn)行,用來填充 DB 的測試數(shù)據(jù)。
在軟件包管理器控制臺中,輸入命令" update-database ",創(chuàng)建數(shù)據(jù)庫并運(yùn)行Seed方法。
如果您收到表已經(jīng)存在并且無法創(chuàng)建的錯(cuò)誤,可能是因?yàn)槟呀?jīng)刪除了數(shù)據(jù)庫,并且在執(zhí)行update-database之前,您運(yùn)行了應(yīng)用程序。在這種情況下,再次刪除Movies.mdf文件,然后重試update-database命令。如果您仍遇到錯(cuò)誤,刪除Migration文件夾及其內(nèi)容,然后從頭開始重做。(即刪除Movies.mdf文件,然后再進(jìn)行Enable-Migrations)
運(yùn)行該應(yīng)用程序,然后瀏覽URL /Movies Seed數(shù)據(jù)顯示如下:
為影片模型添加評級屬性
給現(xiàn)有的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 應(yīng)用程序 Build>Build Move或CTRL-SHIFT-B.
現(xiàn)在,您已經(jīng)更新了Model類,您還需要更新\Views\Movies\Index.cshtml和\Views\Movies\Create.cshtml視圖模板,以便能在瀏覽器中顯示新的Rating屬性。
打開\Views\Movies\Index.cshtml文件,在Price列后面添加th>Rating/th>的列頭。然后添加一個(gè)td>列來顯示@item.Rating的值。下面是更新的Index.cshtml視圖模板:
@model IEnumerableMvcMovie.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標(biāo)簽結(jié)束處的附近添加如下代碼。您可以在創(chuàng)建新的電影時(shí)指定一個(gè)電影等級。
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ù)庫Movie表的Schema不同。(數(shù)據(jù)庫表中,沒有Rating列。)
我們將使用Code First Migrations 來解決這一問題。
更新Seed方法,以便它能為新的列提供一個(gè)值。打開 Migrations\Configuration.cs 文件,并將Rating 字段添加到影片的每個(gè)對象。
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,來檢查當(dāng)前電影模型與當(dāng)前的影片 DB Schema并創(chuàng)建必要的代碼以將數(shù)據(jù)庫遷移到新的模型。AddRatingMig 是一個(gè)任意的文件名參數(shù),用于命名migration文件。它將有助于使得遷移步驟成為一個(gè)有意義的名字。
當(dāng)命令完成后,用Visual Studio 打開類文件,新繼承自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解決方案,然后在 程序包管理器控制臺 窗口中輸入"update-database"命令。
下面的圖片顯示了 程序包管理器控制臺 窗口的輸出 (AddRatingMig 的前綴時(shí)間戳將有所不同)。
重新運(yùn)行應(yīng)用程序,然后瀏覽 /Movies 的 URL。您可以看到新的評級字段。
單擊CreateNew鏈接來添加一部新電影。注意,請您可以為電影添加評級。
單擊Create。新的電影,包括評級,將顯示在電影列表中:
此外您也應(yīng)該把Rating 字段添加到編輯、 詳細(xì)信息和 SearchIndex 的視圖模板中。
您可以再次在 程序包管理器控制臺 窗口中輸入"update-database"命令,將不會有任何新的變化,因?yàn)閿?shù)據(jù)庫Schema 和模型類現(xiàn)在是匹配的。
在本節(jié)中,您看到了如何修改模型對象并始終保持其和數(shù)據(jù)庫Schema的同步。您還學(xué)習(xí)了使用填充示例數(shù)據(jù)來創(chuàng)建新數(shù)據(jù)庫的例子,您可以反復(fù)嘗試。接下來,讓我們看看如何將豐富的驗(yàn)證邏輯添加到模型類,并對模型類執(zhí)行一些強(qiáng)制的業(yè)務(wù)規(guī)則驗(yàn)證。
您可能感興趣的文章:- 基于Asp.Net MVC4 Bundle捆綁壓縮技術(shù)的介紹
- 使用asp.net MVC4中的Bundle遇到的問題及解決辦法分享
- ASP.NET MVC4之js css文件合并功能(3)
- ASP.NET MVC4 HtmlHelper擴(kuò)展類,實(shí)現(xiàn)分頁功能
- ASP.NET MVC4入門教程(一):入門介紹
- ASP.NET MVC4入門教程(二):添加一個(gè)控制器
- ASP.NET MVC4入門教程(三):添加一個(gè)視圖
- ASP.NET MVC4入門教程(四):添加一個(gè)模型
- ASP.NET MVC4入門教程(五):從控制器訪問數(shù)據(jù)模型
- ASP.NET MVC4入門教程(六):驗(yàn)證編輯方法和編輯視圖
- ASP.NET MVC4入門教程(八):給數(shù)據(jù)模型添加校驗(yàn)器
- ASP.NET MVC4入門教程(九):查詢詳細(xì)信息和刪除記錄