ASP.NET MVC 5 - 给电影表和模型添加新字段

21 篇文章 0 订阅

在本节中,您将使用实体框架代码第一次迁移迁移到模型类的一些变化,所以该更改应用于数据库。

默认情况下,当您使用实体框架代码优先将自动创建一个数据库,像你那样早些时候在本教程中,代码优先表向数据库中添加来帮助跟踪数据库的架构是否与它从生成的模型类同步。如果他们不同步,实体框架将引发错误。这使得它易于在开发时可能发现否则只 (由模糊错误) 在运行时跟踪问题。

设置代码第一次迁移模型更改

导航到解决方案资源管理器。Movies.mdf文件上点击鼠标右键并选择删除来删除电影数据库。如果你看不到的Movies.mdf文件,单击显示所有文件图标为红色轮廓如下所示。

生成该应用程序,以确保没有错误。

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

Add Pack Man 

程序包管理器控制台窗口中 PM>提示输入

启用-迁移-ContextTypeName MvcMovie.Models.MovieDBContext

启用迁移命令 (如上所示) 在新的迁移文件夹中创建一个Configuration.cs文件。

Visual Studio 打开Configuration.cs文件。Seed法在Configuration.cs文件替换为下面的代码︰

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 下出现红色波浪线和选择解决,然后单击使用 MvcMovie.Models;

这样做将添加以下使用语句︰

using MvcMovie.Models;

代码第一次迁移调用Seed后每个迁移 (即,调用更新数据库在程序包管理器控制台) 和这种方法已被插入,或插入它们,如果它们不存在尚未更新行。

下面的代码中的AddOrUpdate方法执行"upsert"操作︰

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

因为种子方法运行与每个迁移时,你不能只是将数据插入,因为您试图添加的行已经将有创建数据库的第一次迁移后。"Upsert"操作可以防止错误将会发生如果您尝试插入行已经存在,但它将覆盖你可能已经在测试应用程序时的数据的任何更改。一些表中的测试数据与您可能不希望这种情况发生︰ 在某些情况下当你测试时更改数据时要更改数据库更新后继续。在这种情况下你想要做条件插入操作︰ 插入行,只有当它不存在。

第一个参数传递给AddOrUpdate方法指定要用来检查是否已存在的行的属性。为您提供的测试电影数据, Title 属性可用于此目的因为列表中的每个标题是唯一︰

context.Movies.AddOrUpdate(i => i.Title,

此代码假定中间商人称谓考是独一无二。如果您手动添加一个重复的标题,你会得到下面的异常下次您执行迁移。

     序列包含多个元素

有关AddOrUpdate方法的详细信息,请参阅照顾与 EF 4.3 AddOrUpdate 方法..

按 CTRL-SHIFT-B 要生成的项目。(以下步骤将失败如果你不建立在这一点上)。

下一步是创建一个DbMigration类用于初始迁移。这种迁移创建一个新的数据库,这就是为什么你删除上一步中的movie.mdf文件。

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

代码第一次迁移的迁移文件夹中创建另一个类文件 (具有名称{DateStamp}_Initial.cs ),并且此类包含创建数据库架构的代码。迁移文件名前固定与时间戳以帮助订购。检查{DateStamp}_Initial.cs文件,它包含为电影 DB 创建Movies 表的说明。当您更新在下面,这说明数据库{DateStamp}_Initial.cs文件将运行并创建 DB 架构。然后种子方法将运行来填充与测试数据 DB。

程序包管理器控制台中,输入命令update-database来创建数据库并运行Seed 方法。

如果你得到一个错误,指示表已经存在并且无法创建,可能是因为您运行应用程序,您已删除的数据库后,在你执行update-database之前。在这种情况下,再删除Movies.mdf文件,然后重试update-database命令。如果你仍然得到一个错误,删除迁移文件夹及其内容,然后开始的指示 (即删除Movies.mdf文件然后继续启用迁移) 此页面的顶部。

运行应用程序并定位到/Movies的 URL。种子数据显示。

将评级属性添加到电影模型

通过将新的Rating属性添加到现有的 Movie课开始。打开Models\Movie.cs文件并添加像这样的Rating属性︰

public string Rating { get; set; }

完整的Movie类现在看起来像下面的代码︰

public class Movie
{
    public int ID { get; set; }
    public string Title { get; set; }

    [Display(Name = "Release Date")]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime ReleaseDate { get; set; }
    public string Genre { get; set; }
    public decimal Price { get; set; }
    public string Rating { get; set; }
}

生成应用程序 (Ctrl + Shift + B)。

因为您已经添加到Movie类的一个新的领域,你还需要更新绑定白名单所以这个新属性将包括。更新Create Edit 操作方法,包括Rating属性的bind 属性︰

[Bind(Include = "ID,Title,ReleaseDate,Genre,Price,Rating")]

你还需要更新视图模板来显示、 创建和编辑浏览器视图中的新Rating属性。

打开\Views\Movies\Index.cshtml文件并添加一个 <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")
    @using (Html.BeginForm("Index", "Movies", FormMethod.Get))
    {
    <p>
        Genre: @Html.DropDownList("movieGenre", "All")
        Title: @Html.TextBox("SearchString")
        <input type="submit" value="Filter" />
    </p>
    }
</p>
<table class="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文件并添加具有下面的 highlighed 标记的 Rating 字段。这将呈现一个文本框,以便创建一部新电影时,你可以指定评级。

        <div class="form-group">
            @Html.LabelFor(model => model.Price, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Price)
                @Html.ValidationMessageFor(model => model.Price)
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.Rating, new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Rating)
                @Html.ValidationMessageFor(model => model.Rating)
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

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

运行应用程序并定位到/Movies的 URL。当你这样做时,不过,你会看到下列错误之一︰



自创建数据库,支持 'MovieDBContext' 上下文模型已更改。考虑使用代码第一次迁移来更新数据库 (http://go.microsoft.com/fwlink/?LinkId=238269)。

你能看到此错误,因为在应用程序中更新后的Movie模式类现在比Movie表的现有数据库的架构不同。(没有Rating列在数据库表中)

有几种方法解决该错误︰

  1. 有实体框架会自动删除并重新创建基于新模型类架构的数据库。这种方法是在当你正在做一个测试数据库; 积极发展开发周期的早期非常方便它允许您快速一同进化的模型和数据库的架构。不利的方面,不过,是你失去现有数据库中的数据 — — 所以你想在生产数据库上使用这种方法 !使用初始值设定项来自动种子具有测试数据的数据库通常是生产性的方式来开发应用程序。在实体框架数据库初始值设定项的详细信息,请参阅汤姆戴克神奇ASP.NET MVC/实体框架教程.
  2. 显式修改现有数据库的架构,使其匹配模型的类。这种方法的优点是您保持您的数据。您可以进行此更改,要么手动或通过创建一个数据库更改脚本。
  3. 使用代码第一次迁移来更新数据库架构。

在本教程中,我们将使用代码第一次迁移。

更新的种子的方法,它为新列提供值。打开 Migrations\Configuration.cs 文件,并将评级字段添加到影片的每个对象。

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

生成解决方案,然后打开程序包管理器控制台窗口并输入以下命令︰

add-migration Rating

add-migration命令告诉迁移框架来检查当前电影模型与当前的电影 DB 架构并创建必要的代码以将数据库迁移到新的模型。评分的名称是任意的和用于命名迁移文件。它有利于使用有意义的迁移步骤名称。

当此命令完成,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");
    }
}

生成解决方案,然后在程序包管理器控制台窗口中输入update-database命令。

下面的图像显示的输出在程序包管理器控制台窗口中 (预先计算评分的日期戳将不同)。

重新运行应用程序并导航到 /Movies URL。你可以看到新的评级字段。

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

7_CreateRioII

单击创建新的电影,包括评级,现在显示在电影清单︰

7_ourNewMovie_SM

现在,该项目使用的迁移,你不需要删除数据库,当您添加一个新字段或否则更新架构。在下一节中,我们会进行更多的架构更改,并使用迁移来更新数据库。

您还应该向编辑、 详情和删除视图模板添加Rating 字段。

您可以再次在程序包管理器控制台窗口中输入"更新数据库"命令和没有迁移代码将运行,因为该架构与模型相匹配。然而,运行"更新数据库"将Seed 方法再次运行,和如果您更改任何种子数据,所做的更改将会丢失,因为Seed 方法 upserts 数据。你可以阅读更多关于Seed 法在汤姆戴克流行ASP.NET MVC/实体框架教程.

在本节中,你看到如何可以修改模型对象和保持数据库的同步所做的更改。您还学习了的方式来填充新创建的数据库与样本数据,所以你可以尝试方案。这是只是快速介绍代码第一次,看到更完整的教程,对主体创建 ASP.NET MVC 应用程序中的实体框架数据模型接下来,让我们看看如何可以将丰富的验证逻辑添加到模型类和启用一些业务规则来强制执行。

-----------------------------------------------------------------------------------------

《ASP.NET MVC 5 入门指南》12篇文章汇总如下:

1. ASP.NET MVC 5 - 入门

2. ASP.NET MVC 5 - 控制器

3. ASP.NET MVC 5 - 视图

4. ASP.NET MVC 5 - 添加一个模型

5. ASP.NET MVC 5 - 创建连接字符串(Connection String)并使用SQL Server LocalDB

6. ASP.NET MVC 5 - 从控制器访问数据模型

7. ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

8. ASP.NET MVC 5 - 将数据从控制器传递给视图

9. ASP.NET MVC 5 - 添加搜索

10. ASP.NET MVC 5 - 给电影表和模型添加新字段

11. ASP.NET MVC 5 - 给数据模型添加校验器

12. ASP.NET MVC 5 - 查询Details和Delete方法

希望这些文章对感兴趣的朋友有所帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值