欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET MVC4入门教程(七):给电影表和模型添加新字段

程序员文章站 2023-12-16 18:44:16
在本节中,您将使用entity framework code first来实现模型类上的操作。从而使得这些操作和变更,可以应用到数据库中。 默认情况下,就像您在之前的教程...

在本节中,您将使用entity framework code first来实现模型类上的操作。从而使得这些操作和变更,可以应用到数据库中。

默认情况下,就像您在之前的教程中所作的那样,使用 entity framework code first自动创建一个数据库,code first为数据库所添加的表,将帮助您跟踪数据库是否和从它生成的模型类是同步的。如果他们不是同步的,entity framework将抛出一个错误。这非常方便的在开发时就可以发现错误,否则您可能会在运行时才发现这个问题。 (由一个晦涩的错误信息,才发现这个问题。)

为对象模型的变更设置 code first migrations

如果您使用的是 visual studio 2012,从解决方案资源管理器中双击movies.mdf,打开数据库工具。visual studio express for web将显示数据库资源管理器,visual studio 2012 将显示服务器资源管理器。如果您使用的是visual studio 2010,请使用 sql server对象资源管理器。

在数据库工具 (数据库资源管理器、 服务器资源管理器或 sql server对象资源管理器),右键单击moviedbcontext ,并选择删除以删除电影数据库。

返回到解决方案资源管理器。在movies.mdf文件上右键单击,并选择删除以删除电影数据库。

build应用程序,以确保没有任何编译错误。

从工具菜单上,单击库包管理器,然后点击程序包管理器控制台.

在 软件包管理器控制台 窗口中 pm> 提示符下输入"enable-migrations –contexttypename mvcmovie.models.moviedbcontext"。

(如上所示)enable-migrations命令会在migrations文件夹中创建一个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下面出现的红色波浪线上右键单击,并选择resolve然后点击using mvcmovie.models;

这样做之后,将添加以下的 using语句:

using mvcmovie.models;

每次code first migrations 会调用seed 方法(即,在程序包管理器控制台中调用update-database),并且此次调用会更新行:更新已经插入的行,或把不存在的行也插入。

按 ctrl-shift-b 来build工程。(如果此次build不成功,以下的步骤将会失败。)

下一步是创建一个dbmigration类,用于初始化数据库迁移。此迁移类将创建新的数据库,这也就是为什么在之前的步骤中你要删除movie.mdf文件。

在软件包管理器控制台窗口中,输入"add-migration initial"命令来创建初始迁移。" initial" 的名称是任意,是用于创建迁移文件的名称。

code first migrations将会在migrations文件夹中创建另一个类文件 (文件名为: {datestamp}_initial.cs ),此类中包含的代码将创建数据库的schema。迁移文件名使用时间戳作为前缀,以帮助用来排序和查找。查看{datestamp}_initial.cs文件,它包含了为电影数据库创建电影表的说明。当您更新数据库时,{datestamp}_initial.cs文件将会被运行并创建 db 的schema。然后seed方法将运行,用来填充 db 的测试数据。

在软件包管理器控制台中,输入命令" update-database ",创建数据库并运行seed方法。

如果您收到表已经存在并且无法创建的错误,可能是因为您已经删除了数据库,并且在执行update-database之前,您运行了应用程序。在这种情况下,再次删除movies.mdf文件,然后重试update-database命令。如果您仍遇到错误,删除migration文件夹及其内容,然后从头开始重做。(即删除movies.mdf文件,然后再进行enable-migrations)

运行该应用程序,然后浏览url /movies seed数据显示如下:

为影片模型添加评级属性

给现有的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 应用程序 build>build move或ctrl-shift-b.

现在,您已经更新了model类,您还需要更新\views\movies\index.cshtml\views\movies\create.cshtml视图模板,以便能在浏览器中显示新的rating属性。

打开\views\movies\index.cshtml文件,在price列后面添加<th>rating</th>的列头。然后添加一个<td>列来显示@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>

下一步,打开\views\movies\create.cshtml文件,并在form标签结束处的附近添加如下代码。您可以在创建新的电影时指定一个电影等级。

<div > @html.labelfor(model => model.rating) </div>
<div > @html.editorfor(model => model.rating) @html.validationmessagefor(model => model.rating) </div>

现在,您已经更新应用程序代码以支持了新的rating属性。

现在运行该应用程序,然后浏览 /movies的 url。然而,当您这样做时,您将看到以下之一的错误信息:

你现在看到此错误,因为在应用程序中,最新的movie模型类和现有的数据库movie表的schema不同。(数据库表中,没有rating列。)

我们将使用code first migrations 来解决这一问题。

更新seed方法,以便它能为新的列提供一个值。打开 migrations\configuration.cs 文件,并将rating 字段添加到影片的每个对象。

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,来检查当前电影模型与当前的影片 db schema并创建必要的代码以将数据库迁移到新的模型。addratingmig 是一个任意的文件名参数,用于命名migration文件。它将有助于使得迁移步骤成为一个有意义的名字。

当命令完成后,用visual studio 打开类文件,新继承自dbmigration 类的定义,并在up 方法中,您可以看到创建新列的代码:

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 的前缀时间戳将有所不同)。

重新运行应用程序,然后浏览 /movies 的 url。您可以看到新的评级字段。

单击createnew链接来添加一部新电影。注意,请您可以为电影添加评级。

单击create。新的电影,包括评级,将显示在电影列表中:

此外您也应该把rating 字段添加到编辑、 详细信息和 searchindex 的视图模板中。

您可以再次在 程序包管理器控制台 窗口中输入"update-database"命令,将不会有任何新的变化,因为数据库schema 和模型类现在是匹配的。

在本节中,您看到了如何修改模型对象并始终保持其和数据库schema的同步。您还学习了使用填充示例数据来创建新数据库的例子,您可以反复尝试。接下来,让我们看看如何将丰富的验证逻辑添加到模型类,并对模型类执行一些强制的业务规则验证。

上一篇:

下一篇: