您的位置:首页 > 编程语言 > ASP

给电影的模型(Model)和表格增加新的字段(ASP.NET MVC3系列文章七)

2012-03-09 15:49 501 查看
原址:http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/getting-started-with-mvc3-part7-cs

这个教程将会使用Microsoft Visual Web Developer 2010 Express Service Pack 1来教会您构建一个基于ASP.NET MVC Web应用。 在您开始之前,请确保已经安装了下面罗列的必备条件。您可以点击接下来的链接来下载它们:Web Platform Installer。或者您可以使用下面的链接来单个安装:

Visual Studio Web Developer Express SP1 prerequisites
ASP.NET MVC 3 Tools Update
SQL Server Compact 4.0(runtime + tools support)

如果您使用的是Visual Studio 2010, 可以点击接下来的链接来安装这些必备条件:
Visual Studio 2010 prerequisites.

在这个Visual Web Developer项目中将会全程使用c#.
Download the C# version.。如果您比较擅长VB, 可以在这个教程中改为VB
Visual Basic version

在这次章节中,您将会对模型(model)类进行一些修改,在这个过程中,您将学会怎么把针对模型的修改映射到数据库中去。

给电影模型(Model)增加一个评级(Rating)属性

向已存在的Movie类中增加一个新的Rating属性。打开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; }
}


使用Debug > Build Movie 命令重新编译应用。

既然您已经更新了模型(model)类,现在也需要相应的更新\Views\Movies\Index.cshtml和\Views\Movies\Create.cshtml视图(view)模板,向里面增加一个新的Rating属性。

打开\Views\Movies\Index.cshtml 文件并且在Price列的下面增加一个
<th>Rating</th>
列,然后在模板结尾附近增加一个
<td>
列,并且在里面呈现
@item.Rating
值。更新Index.cshtml 视图(view)模板后,如下所示:

<table>
<tr>
<th></th>
<th>Title</th>
<th>Release Date</th>
<th>Genre</th>
<th>Price</th>
<th>Rating</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 Me", "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模型(model)类跟已存在的数据库Movie表的结构有所不同。(在数据库表中没有Rating列。)

默认下,当您如之前教程中做的那样使用Entity Framework中的"Code First"模式去自动创建数据库,"Code First"会向数据库中增加一个表,用以跟踪数据库结构和模型(model)类是否同步,如果没有同步, Entity Framework会抛出一个错误,这样在设计的时候就可以很容易的对问题进行追踪。这个同步检查特性引起的一个错误信息就如您刚刚看到的一样。

这里有两种方法可以解决这个错误:

删除已有的Entity Framework自动代码,基于新的模型(model)类结构重新创建数据库。当在一个测试数据库中进行开发时,这个方法是非常的方便,因为它允许您快速的同步改变模型(model)和数据库结构。不好的地方是,您将会失去数据库中已经存在的数据— 因此您不会想要在生产环境中使用这种方式。

按照模型类去修改已经存在的数据库结构,这个方法的优点是,可以保留您的数据,要做到这点,您可以手动的改变或者通过数据库脚本进行改变。

在这次教程中,我们使用了第一个方法—您将会使用Entity Framework的"Code First "模式去重新的生成数据库,以此响应模型(model)的改变。

在改变后的模型(Model)基础上自动的重新创建数据库

让我们更新应用以便"Code First"自动的删除和重新创建数据库以适应任何时候在应用中对模型的修改。

警告 您可能会使用自动删除和重新创建数据库的方法,仅仅是在当您使用一个测试的数据库进行开发,并且绝不会在一个生产数据库包含真实的数据,因为在生产服务器中使用这种方式会丢失数据。

Solution Explorer中,在Models文件夹上右键,选择Add,然后选择Class。



类命名为"MovieInitializer"。更新
MovieInitializer
类去包含下面的代码:

using System;
using System.Collections.Generic;
using System.Data.Entity;

namespace MvcMovie.Models {
public class MovieInitializer : DropCreateDatabaseIfModelChanges<MovieDBContext> {
protected override void Seed(MovieDBContext context) {
var movies = new List<Movie> {

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

new Movie { Title = "Ghostbusters ",
ReleaseDate=DateTime.Parse("1984-3-13"),
Genre="Comedy",
Rating="R",
Price=8.99M},

new Movie { Title = "Ghostbusters 2",
ReleaseDate=DateTime.Parse("1986-2-23"),
Genre="Comedy",
Rating="R",
Price=9.99M},

new Movie { Title = "Rio Bravo",
ReleaseDate=DateTime.Parse("1959-4-15"),
Genre="Western",
Rating="R",
Price=3.99M},
};

movies.ForEach(d => context.Movies.Add(d));
}
}
}


这个
MovieInitializer类指定了当模型(model)类改变了,数据库会根据模型(model)自动的删除和重新创建。代码包含了一个Seed方法来指定当每次方法被执行或重新执行的时候,一些默认的数据被自动的添加到数据库中,这提供了一种有用的方式,使用一些示例的数据去自动填充数据库,而不需要每次您修改了模型(model),手动的去填充数据。


既然您是定义了这个
MovieInitializer
类,那么您会想要执行它,以便每次应用都能启动。它检查了是否数据库跟模型(model)类的结构不同,如果不同,您能启动初始化程序去匹配相关的模型(model)重新创建数据库,并且用这些示例数据去填充数据库。

MvcMovies
项目的根目录中打开Global.asax文件:





在Global.asax文件中包含了这个项目中整个应用都会用到的类,并且包含当应用第一次启动时,需要处理的
Application_Start
事件句柄。

让我们在文件的顶部增加两个using 声明。第一个引用了Entity Framework命名空间,第二个引用我们
MovieInitializer
类的命名空间:

using System.Data.Entity;            // Database.SetInitialize
using MvcMovie.Models;              // MovieInitializer


然后找到
Application_Start
方法,在方法的开始位置增加一个对Database.SetInitializer 的调用,如下所示:

protected void Application_Start()
{
Database.SetInitializer<MovieDBContext>(new MovieInitializer());

AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}


这个
Database.SetInitializer语句,您仅仅增加了一个象征,如果模型和数据库结构不同,数据库映射的
MovieDBContext实例会自动的删除和重新创建
,并且正如您看到的,它将会使用在[code]MovieInitializer
类中指定的示例数据来填充数据库。[/code]

关闭Global.asax 文件。

重新启动应用,然后链接到/Movies URL。当应用开始,它发觉模型(model)框架不在匹配到数据库结构,它根据新的模型(model)框架自动的重新创建了数据库,并且把示例数据填充到数据库中。



单击Create New 链接去增加一部新的电影。注意您现在可以增加一个评级。





单击Create。现在在电影列表中新增的电影包含了评级。





在这次章节中,您看到了怎么去修改模型(model)对象并且在修改之后能保持与数据库同步。您也学会了一种方式去给新创建的数据库填充一些示例数据。因此,您可以尝试着添加一个电影脚本的字段。下次,让我们看看怎样在模型(model)类中增加一个富验证逻辑,并且启用一些业务规则。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: