在上一篇文章中,咱们学习了如何使用实体框架的“Code First Migrations ”工具,使用其中的“迁移”功能对模型类进行一些修改,同时同步更新对应数据库的表结构。html
在本文章中,咱们将使用“Code First Migrations ”工具。使用其中的“Send”更新方法,添加Rating字段到每一个Book对象与数据库表中。数据库
首先,在Visual Studio打开Models\ Book.cs文件,在Book类中添加一个新的Rating属性。代码以下:浏览器
public string Rating { get; set; }
完整的Book类。代码以下。
架构
public class Book { public int BookID { get; set; } public string Category { get; set; } public string Name { get; set; } public int Numberofcopies { get; set; } public int AuthorID { get; set; } public decimal Price { get; set; } public DateTime PublishDate { get; set; } public string Rating { get; set; } }
第2、使用菜单“生成-->生成解决方案”来生成应用程序。或按下CTRL-SHIFT-B。
第3、如今你已经更新了模型类,你还须要更新在\ Views\Book\ Index.cshtml和\Views\Book\ Create.cshtml视图模板,以便在浏览器视图中显示新的“Rating”属性。
在解决方案管理器中打开,Views\Book\Index.cshtml文件,并在PublishDate列标题后面添加一个<TH>Rating</TH>列。而后在PublishDate列后面添加一个<TD>列,用来呈现Rating值。下面是更新后的Index.cshtml视图模板的代码:框架
@model IEnumerable<MvcApplication1.Models.Book> @{ ViewBag.Title = "Index"; } <h2>Index</h2>
<p> @Html.ActionLink("Create New", "Create") </p>
<table>
<tr>
<th> @Html.DisplayNameFor(model => model.Category) </th>
<th> @Html.DisplayNameFor(model => model.Name) </th>
<th> @Html.DisplayNameFor(model => model.Numberofcopies) </th>
<th> @Html.DisplayNameFor(model => model.AuthorID) </th>
<th> @Html.DisplayNameFor(model => model.Price) </th>
<th> @Html.DisplayNameFor(model => model.PublishDate) </th>
<th> @Html.DisplayNameFor(model => model.Rating) </th>
<th></th>
</tr> @foreach (var item in Model) { <tr>
<td> @Html.DisplayFor(modelItem => item.Category) </td>
<td> @Html.DisplayFor(modelItem => item.Name) </td>
<td> @Html.DisplayFor(modelItem => item.Numberofcopies) </td>
<td> @Html.DisplayFor(modelItem => item.AuthorID) </td>
<td> @Html.DisplayFor(modelItem => item.Price) </td>
<td> @Html.DisplayFor(modelItem => item.PublishDate) </td>
<td> @Html.DisplayFor(model => item.Rating) </td>
<td> @Html.ActionLink("Edit", "Edit", new { id=item.BookID }) | @Html.ActionLink("Details", "Details", new { id=item.BookID }) | @Html.ActionLink("Delete", "Delete", new { id=item.BookID }) </td>
</tr> } </table>
第4、在“解决方案资源管理器”中打开“Views\Book\Create.cshtml文件,并在文件的末尾附近添加下面的标记。这里使用一个文本框,方便您能够建立一个新的书籍时指定一个“Rating”。代码以下。ide
<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>
第5、如今已经更新了应用程序的代码,应用程序已经能够支持新的“Rateing”属性。
按F5,运行应用程序,在浏览器中浏览/Book/Index网址。此时你会看到下面的这个错误。以下图1、图2。工具
图1post
图2学习
之因此出现这个错误信息,是由于在应用程序更新的Book模型类与现有数据库的Book表的架构不一样。 (即Book模型类中有一个新的属性Rating,而数据库中的Book表中却没有这个字段。 )
这个错误能够经过如下几个方法来解决这个错误:测试
1 ) 由实体构架使用新实体的新模型类架构自动删除并从新建立数据库。这种作法能很是方便的建立一个测试数据库;它可让你快速进行开发,模型和数据库架构是在一块儿的。不过这种方法的缺点是,你将失去数据库中已经存在的数据 ——因此不建议在生产环境使用这种方法!使用这种方式自动生成一个数据库,并在数据库中插入初始化的测试数据是很是方便的方式,而且能够快速开发应用程序。
2 ) 手动修改现有数据库的架构,让它匹配新的模型类。这种方法的好处是,你能够保有你已经存在的测试数据。您能够手动或经过建立一个数据库更改脚本进行此更改。
3,使用“Code First Migrations ”工具更新数据库架构。
在本文章中,咱们将使用“Code First Migrations ”工具。
更新“Send”方法,以便它提供了新的列的值。打开Migrations\Configuration.cs文件,添加Rating字段到每一个Book对象中。代码以下。
new Book { Name = "DB 2", PublishDate = DateTime.Parse("1986-2-23"), Category = "IBM", AuthorID=1, Numberofcopies=22, Price = 9.99M, Rating = "H" }
第6、执行菜单--》工具--》生成--》生成解决方案,而后在程序包管理器控制台窗口中输入“add-migration AddRatingMig”命令。 以下图。
下图显示了在程序包管理器控制台窗口中的输出(时间戳前面加上AddRatingMig会有所不一样。)
这个“add-migration ”命令告诉迁移框架,研究当前Book的模型与当前Book数据库模式,并创建必要的代码到数据库迁移到新的模型。该AddRatingMig是任意的,是用来命名迁移文件。它有助于使用一个有意义的名称迁移步骤。
当这个命令执行完成后,Visual Studio将打开一个新定义的DbMIgration派生类的类文件,你能够参阅新建立的代码,代码以下。
public partial class AddRatingMig : DbMigration { public override void Up() { AddColumn("dbo.Books", "Rating", c => c.String()); } public override void Down() { DropColumn("dbo.Books", "Rating"); } }
第7、执行菜单--》工具--》生成--》生成解决方案,而后在程序包管理器控制台窗口中输入“update-database”命令。 以下图。
下图显示了在程序包管理器控制台窗口中的输出(时间戳前面加上AddRatingMig会有所不一样。)
按F5,从新运行这个应用程序,使用浏览器浏览/Book/Index网址。你能够看到新的列表页面,会增长一个Rating字段进行显示。以下图。
第8、单击“Create New”连接,将导航到添加一个新的书籍信息的页面。请注意,在这个新的页面中,您能够添加一个等级字段信息。
单击“Create”按钮。一本新的书籍数据,包括评级字段,如今都显示在列表中了:以下图。
你也应该将Rating字段添加到Edit,Details及SearchIndex三个视图模板。
你能够再次进入程序包管理器控制台窗口中执行“update-database”命令,窗口中输入内容并无变化,由于架构模型相匹配。
在这第8、第九两篇文章中,您学会了如何修改模型对象;学会如何在修改模型对象以后更新数据库的结构;学会如何使用样本数据来填充新建立的数据库。
学习ASP.NET MVC系列:
学习ASP.NET MVC(一)——个人第一个ASP.NET MVC应用程序
学习ASP.NET MVC(二)——个人第一个ASP.NET MVC 控制器
学习ASP.NET MVC(三)——个人第一个ASP.NET MVC 视图
学习ASP.NET MVC(四)——个人第一个ASP.NET MVC 实体对象
学习ASP.NET MVC(五)——个人第一个ASP.NET MVC CURD页面
学习ASP.NET MVC(六)——个人第一个ASP.NET MVC 编辑页面
学习ASP.NET MVC(七)——个人第一个ASP.NET MVC 查询页面