学习ASP.NET Core Razor 编程系列十——添加新字段
学习ASP.NET Core Razor 编程系列目录
学习ASP.NET Core Razor 编程系列二——添加一个实体
学习ASP.NET Core Razor 编程系列三——创建数据表及创建项目基本页面
学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面
学习ASP.NET Core Razor 编程系列六——数据库初始化
学习ASP.NET Core Razor 编程系列七——修改列表页面
学习ASP.NET Core Razor 编程系列八——并发处理
学习ASP.NET Core Razor 编程系列九——增加查询功能
在经过了上面几篇文章的学习这宾,本篇文章我们来学习如何在已经的功能中添加新字段。
一、添加出版社字段到实体类
我们首先在Visual Studio 2017的解决方案资源管理器中打开 Models/Books.cs 文件,并添加一个Publishing字段,代码如下:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; namespace RazorMvcBooks.Models { public class Book { public int ID { get; set; } public string Name { get; set; } [Display(Name = "出版日期")] [DataType(DataType.Date)] public DateTime ReleaseDate { get; set; } public string Author { get; set; } public decimal Price { get; set; } public string Publishing { get; set; } } }
在Visual Studio 2017中按下(Ctrl+Shift+B),或是菜单中选择生成–>生成解决方案
二、给列表页面添加Publishing字段
在Visual Studio 2017的解决方案资源管理器中找到 Pages/Books/Index.cshtml文件,然后使用鼠标双击打开,并在文件中添加Publishing字段,代码如下:
@page @model RazorMvcBooks.Pages.Books.IndexModel @{ ViewData["Title"] = "Index"; } <h2>Index</h2> <p> <a asp-page="Create">Create New</a> </p> <form> <p> <select asp-for="Author" asp-items="Model.Authors"> <option value="">All</option> </select> 书籍名称 <input type="text" name="SearchString"> <input type="submit" value="查询" /> </p> </form> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.Book[0].Name) </th> <th> @Html.DisplayNameFor(model => model.Book[0].ReleaseDate) </th> <th> @Html.DisplayNameFor(model => model.Book[0].Author) </th> <th> @Html.DisplayNameFor(model => model.Book[0].Price) </th> <th> @Html.DisplayNameFor(model => model.Book[0].Publishing) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.Book) { <tr> <td> @Html.DisplayFor(modelItem => item.Name) </td> <td> @Html.DisplayFor(modelItem => item.ReleaseDate) </td> <td> @Html.DisplayFor(modelItem => item.Author) </td> <td> @Html.DisplayFor(modelItem => item.Price) </td> <td> @Html.DisplayFor(modelItem => item.Publishing) </td> <td> <a asp-page="./Edit" asp-route-id="@item.ID">Edit</a> | <a asp-page="./Details" asp-route-id="@item.ID">Details</a> | <a asp-page="./Delete" asp-route-id="@item.ID">Delete</a> </td> </tr> } </tbody> </table>
按照上面的方式,把Publishing字段添加到“Delete.cshtml”与“Details.cshtml”页面中。
接下来我们在Visual Studio 2017的解决方案资源管理器中打开Create.cshtml,然后选择一个现成<div>元素(例如包含Name字段的div元素),复制,粘贴到如下图的位置,最后把Name修改为Publishing字段。如下图。
添加了Publishing字段之后 Create.cshtml 代码如下:
@page @model RazorMvcBooks.Pages.Books.CreateModel @{ ViewData["Title"] = "Create"; } <h2>Create</h2> <h4>Book</h4> <hr /> <div class="row"> <div class="col-md-4"> <form method="post"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> <label asp-for="Book.Name" class="control-label"></label> <input asp-for="Book.Name" class="form-control" /> <span asp-validation-for="Book.Name" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Book.ReleaseDate" class="control-label"></label> <input asp-for="Book.ReleaseDate" class="form-control" /> <span asp-validation-for="Book.ReleaseDate" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Book.Author" class="control-label"></label> <input asp-for="Book.Author" class="form-control" /> <span asp-validation-for="Book.Author" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Book.Price" class="control-label"></label> <input asp-for="Book.Price" class="form-control" /> <span asp-validation-for="Book.Price" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Book.Publishing" class="control-label"></label> <input asp-for="Book.Publishing" class="form-control" /> <span asp-validation-for="Book.Publishing" class="text-danger"></span> </div> <div class="form-group"> <input type="submit" value="Create" class="btn btn-default" /> </div> </form> </div> </div> <div> <a asp-page="Index">Back to List</a> </div> @section Scripts { @{await Html.RenderPartialAsync("_ValidationScriptsPartial");} }
参照上面的方式给编辑页面添加Publishing字段。
在经过上面的修改之后,但是由于我们还没有进行数据库更新,所以此时运行书籍管理信息系统是会报错的。
此时如果我们在Visual Studio 2017中按下F5,在浏览器中我们会得到如下图的错误信息。
这个错误信息表明我们的实体类与数据库中的表结构不一致。数据库中Book表没有Publishing字段。
三、有几种方法可以解决这个错误
1、让实体框架自动删除并使用新的实体类重新创建数据库。这种方法适合在开发周期的早期使用;它允许您快速地将实体类和数据库表一起快速改进。缺点是丢失数据库中的现有数据。请不要在生产数据库上使用这种方法!在架构更改时删除数据库并使用初始化类自动地用测试数据生成数据库中的数据,这通常是开发应用程序的一种有效方式。
2、通过SQL Server Management Studio显式修改现有数据库中的表,使之与实体类相匹配。这种方法的优点是可以保存数据。您可以手动或通过创建数据库更改脚本来进行更改。
3、使用 Code First 迁移功能来更新数据库。我们将在下一篇文章中进行学习。