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

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

2016-11-04 14:03 309 查看
在本节中,您将使用实体框架代码第一次迁移迁移到模型类的一些变化,所以该更改应用于数据库。

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


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

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



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

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


 

在程序包管理器控制台窗口中
 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
列在数据库表中)

有几种方法解决该错误︰

有实体框架会自动删除并重新创建基于新模型类架构的数据库。这种方法是在当你正在做一个测试数据库;
积极发展开发周期的早期非常方便它允许您快速一同进化的模型和数据库的架构。不利的方面,不过,是你失去现有数据库中的数据
— — 所以你想在生产数据库上使用这种方法 !使用初始值设定项来自动种子具有测试数据的数据库通常是生产性的方式来开发应用程序。在实体框架数据库初始值设定项的详细信息,请参阅汤姆戴克神奇ASP.NET
MVC/实体框架教程.

显式修改现有数据库的架构,使其匹配模型的类。这种方法的优点是您保持您的数据。您可以进行此更改,要么手动或通过创建一个数据库更改脚本。

使用代码第一次迁移来更新数据库架构。

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

更新的种子的方法,它为新列提供值。打开
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。你可以看到新的评级字段。



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



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



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

您还应该向编辑、 详情和删除视图模板添加
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方法

希望这些文章对感兴趣的朋友有所帮助
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mvc入门