原文 Adding a New Field

作者 Rick Anderson

翻译 谢炀(Kiler)

校对 许登洋(Seay)高嵩(Jack)

在这个章节你将使用 Entity Framework Code First 迁移模型中新加的字段,从而将模型字段变更同步到数据库。

当你使用 EF Code First 模式自动创建一个数据库,Code First 模式添加到数据库的表将帮助你来跟踪数据库的数据结构是否和从它生成的模型类是同步的。如果不同步,EF 会抛出异常。这将有助于你在开发阶段就发现错误,否则可能要到运行时才能发现这个错误了(通过一个很隐蔽的错误信息)。

添加一个 Rating 字段到 Movie 模型

打开 Models/Movie.cs 文件,添加一个 Rating 属性:

public class Movie
{
public int ID { get; set; }
public string Title { get; set; } [Display(Name = "Release Date")]
[DataType(DataType.Date)]
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 action 方法包含 Rating 属性需要更新 [Bind] 特性:

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

为了把这个字段显示出来你必须更新视图,在浏览器视图中创建或者编辑一个新的 Rating 属性。

编辑 /Views/Movies/Index.cshtml 文件并添加一个 Rating 字段:

<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.movies[0].Genre)
</th>
<th>
@Html.DisplayNameFor(model => model.movies[0].Price)
</th>
<th>
@Html.DisplayNameFor(model => model.movies[0].ReleaseDate)
</th>
<th>
@Html.DisplayNameFor(model => model.movies[0].Title)
</th>
<th>
@Html.DisplayNameFor(model => model.movies[0].Rating) <!--手工高亮-->
</th>
<th></th>
</tr>
<tbody>
@foreach (var item in Model.movies)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Genre)
</td>
<td>
@Html.DisplayFor(modelItem => item.Price)
</td>
<td>
@Html.DisplayFor(modelItem => item.ReleaseDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.DisplayFor(modelItem => item.Rating) <!--手工高亮-->
</td>

更新 /Views/Movies/Create.cshtml 文件添加 Rating 字段。你可以从上一个 form group 拷贝/粘帖以便于让智能感知帮助你更新字段。智能感知参考 Tag Helpers

应用程序无法工作,直到我们更新了数据库包含新的字段。如果你现在运行程序,你将得到下面的 SqlException :

你看到这个错误是因为更新过的 Movie 模型类与数据库中存在的 Movie 的结构是不同的。(数据库表中没有 Rating 列)

有以下几种方法解决这个错误:

  1. Entity Framework 可以基于新的模型类自动删除并重建数据库结构。在开发环节的早期阶段,当你在测试数据库上积极做开发的时候,这种方式是非常方便的;它可以同时让你快速地更新模型类和数据库结构。但是,缺点是你会丢失数据库中的现有的数据 —— 因此你不想在生产数据库中使用这种方法!使用初始化器自动完成数据库的初始化并填充测试数据,往往是开发应用程序的一个有效方式。

  2. 显式修改现有数据库的结构使得它与模型类相匹配。这种方法的好处是,你可以保留录入过的数据。你可以手动修改或通过执行一个自动创建的数据库更改脚本进行变更。

  3. 采用 Code First 迁移来更新数据库结构。

对于本教程,我们采用 Code First 迁移。

更新 SeedData 类以便于为新的的字段提供填充值。下面展示一个变更的例子,但是你可能希望将这个变更应用到每个 new Movie

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

生成解决方案,然后打开命令提示符。输入以下命令:

dotnet ef migrations add Rating
dotnet ef database update

migrations add 命令通知数据库迁移框架检查 Movie 模型是否与当前 Movie 数据库表结构一致,如果不一致,就会创建新的必要的代码把数据库迁移到新的模型。“Rating” 名字可以是任意的,只是用于迁移文件。对于迁移操作采用有意义的名字是有帮助的。

如果在数据库中删除所有记录,数据库将会被初始化并添加 Rating 字段。你可以在浏览器或者 SSOX ( 即SQL Server Object Explorer(SQL Server对象资源管理器),译者注)中点击删除链接。

运行应用程序并验证你可以用 Rating 字段 create/edit/display 电影。你还应该将 Rating 字段添加到 EditDetails 和 Delete 视图模板中。

返回目录

ASP.NET Core 中文文档 第二章 指南(4.8)添加新的字段的更多相关文章

  1. ASP.NET Core 中文文档 第二章 指南(4.6)Controller 方法与视图

    原文:Controller methods and views 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘) .张仁建(第二年.夏) .许登洋(Seay) .姚阿勇 ...

  2. ASP.NET Core 中文文档 第二章 指南(4.4)添加 Model

    原文:Adding a model 作者:Rick Anderson 翻译:娄宇(Lyrics) 校对:许登洋(Seay).孟帅洋(书缘).姚阿勇(Mr.Yao).夏申斌 在这一节里,你将添加一些类来 ...

  3. ASP.NET Core 中文文档 第二章 指南 (09) 使用 Swagger 生成 ASP.NET Web API 在线帮助测试文档

    原文:ASP.NET Web API Help Pages using Swagger 作者:Shayne Boyer 翻译:谢炀(kiler) 翻译:许登洋(Seay) 对于开发人员来说,构建一个消 ...

  4. ASP.NET Core 中文文档 第二章 指南(1)用 Visual Studio Code 在 macOS 上创建首个 ASP.NET Core 应用程序

    原文:Your First ASP.NET Core Application on a Mac Using Visual Studio Code 作者:Daniel Roth.Steve Smith ...

  5. ASP.NET Core 中文文档 第二章 指南(2)用 Visual Studio 和 ASP.NET Core MVC 创建首个 Web API

    原文:Building Your First Web API with ASP.NET Core MVC and Visual Studio 作者:Mike Wasson 和 Rick Anderso ...

  6. ASP.NET Core 中文文档 第二章 指南(3)用 Visual Studio 发布一个 Azure 云 Web 应用程序

    原文:Getting Started 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘).刘怡(AlexLEWIS).何镇汐 设置开发环境 安装最新版本的 Azure S ...

  7. ASP.NET Core 中文文档 第二章 指南(4.1)ASP.NET Core MVC 与 Visual Studio 入门

    原文:Getting started with ASP.NET Core MVC and Visual Studio 作者:Rick Anderson 翻译:娄宇(Lyrics) 校对:刘怡(Alex ...

  8. ASP.NET Core 中文文档 第二章 指南(4.5)使用 SQL Server LocalDB

    原文:Working with SQL Server LocalDB 作者:Rick Anderson 翻译: 魏美娟(初见) 校对: 孟帅洋(书缘).张硕(Apple).许登洋(Seay) Appl ...

  9. ASP.NET Core 中文文档 第二章 指南(5) 在 Nano Server 上运行ASP.NET Core

    原文 ASP.NET Core on Nano Server 作者 Sourabh Shirhatti 翻译 娄宇(Lyrics) 校对 刘怡(AlexLEWIS).许登洋(Seay).谢炀(kile ...

  10. ASP.NET Core 中文文档 第二章 指南(8) 使用 dotnet watch 开发 ASP.NET Core 应用程序

    原文:Developing ASP.NET Core applications using dotnet watch 作者:Victor Hurdugaci 翻译:谢炀(Kiler) 校对:刘怡(Al ...

随机推荐

  1. java中文乱码解决之道(一)-----认识字符集

    沉寂了许久(大概有三个多月了吧),LZ"按捺不住"开始写博了! java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.c ...

  2. 深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  3. CSS3 3D立方体效果-transform也不过如此

    CSS3系列已经学习了一段时间了,第一篇文章写了一些css3的奇技淫巧,原文戳这里,还获得了较多网友的支持,在此谢过各位,你们的支持是我写文章最大的动力^_^. 那么这一篇文章呢,主要是通过一个3D立 ...

  4. HTML 事件(四) 模拟事件操作

    本篇主要介绍HTML DOM中事件的模拟操作. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4.  ...

  5. 如何避免git每次提交都输入密码

    在ubuntu系统中,如何避免git每次提交都输入用户名和密码?操作步聚如下:1: cd 回车: 进入当前用户目录下:2: vim .git-credentials (如果没有安装vim 用其它编辑器 ...

  6. android studio你可能忽视的细节——启动白屏?drawable和mipmap出现的意义?这里都有!!!

    android studio用了很久了,也不知道各位小伙伴有没有还在用eclipse的,如果还有,楼主真心推荐转到android studio来吧,毕竟亲儿子,你会知道除了启动速度稍微慢些,你找不到一 ...

  7. 【iOS】Xcode8+Swift3 纯代码模式实现 UICollectionView

    开发环境 macOS Sierra 10.12.Xcode 8.0,如下图所示: 总体思路 1.建立空白的storyboard用于呈现列表 2.实现自定义单个单元格(继承自:UICollectionV ...

  8. 深入.NET平台和C#编程总结大全

    对于初学者的你,等到你把这个看完之后就更清楚地认知.NET和C#编程了,好了废话不多说,开始吧!                                                     ...

  9. 在UPDATE中更新TOP条数据以及UPDATE更新中使用ORDER BY

    正常查询语句中TOP的运用: SELECT TOP 1000 * FROM MP_MemberGrade   随意更新一张表中满足条件的前N条数据: UPDATE TOP (1) MP_Member ...

  10. 烂泥:数据库管理之phpmyadmin免密码配置

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 其实这篇文章很早就想写了,但是一直没有时间.刚好今天下午稍微空了点,就把这篇文章整理出来 ...