拉长一个新字段,字段相比较

前言

原文 Adding a New Field
作者 Rick Anderson
翻译 谢炀
校对 许登洋、高嵩

Adding a New Field

品种中日常分测验境况,坐蓐条件,当大家的体系经历了一回周期跨度较长的换代后,当我们揭露到坐蓐条件时,首要的职责是将新添的表,字段更新到分娩数据库。超多时候,当我们公布更新的时候,已经很难记得做了什么改观。

在此个章节你将应用 Entity Framework Code First
迁移模型中新加的字段,进而将模型字段改造同步到数据库。

加上二个新字段

人之常情有些人讲,1.EF Code First
有history记录,那是一种办法,可信么?不可相信赖。相信即就是用Code
First,直接改数据库的必定不唯有自个儿一个。

当你使用 EF Code First 方式自动创造叁个数据库,Code First
形式加上到数据库的表将扶助你来追踪数据库的数据构造是或不是和从它生成的模子类是同步的。借使不一齐,EF
会抛出非常。那将推动你在开辟阶段就开掘错误,不然大概要到运维时工夫窥见这几个张冠李戴了(通过二个很隐瞒的错误消息)。

二〇一六-10-14 3 分钟阅读时间长度 小编 

2.查看实体类更换记录,那也是三个方式。这如若用的DB
First的吗?当然也能够看,就是很劳苦。

累计三个 Rating 字段到 Movie 模型

打开 北京pk赛车官网下载,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。
北京pk赛车官网下载 1

应用程序不能职业,直到大家立异了数据库满含新的字段。假如您今后运作程序,你将获取下边包车型客车
SqlException :
北京pk赛车官网下载 2

您看看那么些指皁为白是因为更新过的 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 Ratingdotnet ef database update

migrations add 命令文告数据库迁移框架检查 Movie 模型是或不是与当下 Movie 数据库表构造相像,即使不等同,就能够成立新的必备的代码把数据库迁移到新的模子。“Rating”
名字能够是放肆的,只是用于迁移文件。对于迁移操作使用有含义的名字是有赞助的。

要是在数据库中去除全部记录,数据库将会被初步化并增多 Rating 字段。你能够在浏览器依然SSOX ( 即SQL Server Object Explorer(SQL
Server对象财富微型机),译者注)中式茶食击删除链接。

运作应用程序并表明你能够用 Rating 字段 create/edit/display
电影。你还应该将 Rating 字段增添到
EditDetails 和 Delete 视图模板中。

重返目录

By Rick Anderson

3.支出进度中,对数据库的更动记下来。这么做过的必然也再三自身三个。手动狗头

In this section you’ll use Entity
Framework Code
First Migrations to add a new field to the model and migrate that change
to the database.

。。。。。

在本节,我们将用EF的Code First
扩展一个新字段并转移到数据库中.

正午的时候,就想着此外二个品类前段日子要更新,改了N多的东西,届期候数据库咋更新呢。就想着写个工具相比较七个版本数据库,表名称,字段,字段类型的差距。

When you use EF Code First to automatically create a database, Code
First adds a table to the database to help track whether the schema of
the database is in sync with the model classes it was generated from.

说干就干。

当你接受 EF Code First
自动的创造贰个数据库,Code
First将会向数据库扩张一张表,他会活动追踪数据库布局的更动并伙同构造的退换。

调控台应用程序,如今只得比较新添,改革。

If they aren’t in sync, EF throws an exception. This makes it easier to
find inconsistent database/code issues.

using System;using System.Collections.Generic;using System.Data.SqlClient;using System.Linq;using System.Text;using Microsoft.EntityFrameworkCore;namespace EFGetTable{ class Program { static void Main(string[] args) { string prdconnectionstring = "Data Source=localhost;initial catalog=ttPRD;user id=sa;password=password;MultipleActiveResultSets=True"; var prd = GetTableNames(prdconnectionstring); string qasconnectionstring = "Data Source=localhost;initial catalog=ttqas;user id=sa;password=password;MultipleActiveResultSets=True"; var qas = GetTableNames(qasconnectionstring); CompareTable(prd, qas); } public static ListTableInfo GetTableNames(string connectionstr) { var tableresult = new ListTableInfo(); string sqlTableName = "Select * From Information_Schema.Tables"; using (SqlConnection connection = new SqlConnection(connectionstr)) { using (SqlCommand cmd = new SqlCommand(sqlTableName, connection)) { try { connection.Open(); SqlDataReader dr = cmd.ExecuteReader();// while (dr.Read()) { // 表名 TableInfo table = new TableInfo(); table.TableName = dr["Table_Name"].ToString(); table.columns.AddRange(GetColumnNamesByTable(dr["Table_Name"].ToString(), connection)); tableresult.Add(table); } connection.Close(); } catch (System.Data.SqlClient.SqlException e) { Console.ForegroundColor = ConsoleColor.Red; Console.Error.WriteLine(e.Message); connection.Close(); } } return tableresult; } } public static ListCloumnInfo GetColumnNamesByTable(string tableName, SqlConnection connection) { var Columnresults = new ListCloumnInfo(); string sqlcolum = $"Select * From Information_Schema.Columns t Where t.Table_Name ='{tableName}'"; using (SqlCommand cmd = new SqlCommand(sqlcolum, connection)) { SqlDataReader dr = cmd.ExecuteReader();// while (dr.Read()) { // 表名 CloumnInfo column = new CloumnInfo(); column.CloumnName = dr["Column_name"].ToString(); column.DateType = dr["DATA_TYPE"].ToString() + dr["CHARACTER_MAXIMUM_LENGTH"].ToString(); Columnresults.Add(column); } return Columnresults; } } public static void CompareTable(ListTableInfo prd, ListTableInfo qas) { foreach (var p in qas) { var tablequery = prd.AsQueryable().Where(t = t.TableName.Equals(p.TableName)); if (!tablequery.Any()) { Console.WriteLine($"New Created Table {p.TableName}"); continue; } else { var querytable = tablequery.FirstOrDefault(); p.columns.ForEach(c = { var Cloumnquery = querytable.columns.Select(cc = cc.CloumnName).Contains(c.CloumnName); if (!Cloumnquery) { Console.WriteLine($"New add cloumn: {c.CloumnName} on Table {p.TableName}"); } else { var querycloumn = querytable.columns.Where(qt = qt.CloumnName.Equals(c.CloumnName)).FirstOrDefault(); if (!querycloumn.DateType.Equals(c.DateType)) { Console.WriteLine($"DateType Different: cloumn: {c.CloumnName} , {querycloumn.DateType}=={c.DateType} on Table {p.TableName}"); } } }); } } } } public class TableInfo { public TableInfo() { columns = new ListCloumnInfo(); } public string TableName { get; set; } public ListCloumnInfo columns { get; set; } } public class CloumnInfo { public string CloumnName { get; set; } public string DateType { get; set; } }}

假诺她们未协同,EF会抛出非常。那使得代码与DB保持一致变得轻松。

测量试验结果

Adding a Rating Property to the Movie Model

总结

给 Movie
模型加上多个阶段字段

以上正是那篇随笔的整体内容了,希望本文的剧情对我们的读书或许办事有着一定的参照他事他说加以调查学习价值,谢谢大家对剧本之家的帮忙。

Open the Models/Movie.cs file and add a Rating property:

打开 Models/Movie.cs
文件,并丰硕 Rating 属性字段:

北京pk赛车官网下载 3北京pk赛车官网下载 4

 1 public class Movie
 2 
 3 {
 4 
 5     public int ID { get; set; }
 6 
 7     public string Title { get; set; }
 8 
 9  
10 
11     [Display(Name = "Release Date")]
12 
13     [DataType(DataType.Date)]
14 
15     public DateTime ReleaseDate { get; set; }
16 
17     public string Genre { get; set; }
18 
19     public decimal Price { get; set; }
20 
21     public string Rating { get; set; }
22 
23 }

C# code

Build the app (Ctrl+Shift+B).

编写翻译应用。

Because you’ve added a new field to the Movie class, you also need to
update the binding white list so this new property will be included.

因为你在 Movie
类中新扩张了四个字段,你供给创新绑定,这样这几个新字段技术被含有。

In MoviesController.cs, update the [Bind] attribute for both
the Create and Edit action methods to include the Rating property:

MoviesController.cs
文件中,更新 Create 、 Edit 方法的 [Bind] ,以带有 Rating
属性字段:

北京pk赛车官网下载 5北京pk赛车官网下载 6

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

C# Code

You also need to update the view templates in order to display, create
and edit the new Rating property in the browser view.

您同样须要立异视图模板,以便在浏览器上显示,新建,编辑
Rating 字段。

Edit the /Views/Movies/Index.cshtml file and add a Rating field:

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

北京pk赛车官网下载 7北京pk赛车官网下载 8

 1 <table class="table">
 2 
 3     <thead>
 4 
 5         <tr>
 6 
 7             <th>
 8 
 9                 @Html.DisplayNameFor(model => model.movies[0].Title)
10 
11             </th>
12 
13             <th>
14 
15                 @Html.DisplayNameFor(model => model.movies[0].ReleaseDate)
16 
17             </th>
18 
19             <th>
20 
21                 @Html.DisplayNameFor(model => model.movies[0].Genre)
22 
23             </th>
24 
25             <th>
26 
27                 @Html.DisplayNameFor(model => model.movies[0].Price)
28 
29             </th>
30 
31             <th>
32 
33                 @Html.DisplayNameFor(model => model.movies[0].Rating)
34 
35             </th>
36 
37             <th></th>
38 
39         </tr>
40 
41     </thead>
42 
43     <tbody>
44 
45         @foreach (var item in Model.movies)
46 
47         {
48 
49             <tr>
50 
51                 <td>
52 
53                     @Html.DisplayFor(modelItem => item.Title)
54 
55                 </td>
56 
57                 <td>
58 
59                     @Html.DisplayFor(modelItem => item.ReleaseDate)
60 
61                 </td>
62 
63                 <td>
64 
65                     @Html.DisplayFor(modelItem => item.Genre)
66 
67                 </td>
68 
69                 <td>
70 
71                     @Html.DisplayFor(modelItem => item.Price)
72 
73                 </td>
74 
75                 <td>
76 
77                     @Html.DisplayFor(modelItem => item.Rating)
78 
79                 </td>
80 
81                 <td>

HTML Code

Update the /Views/Movies/Create.cshtml with a Rating field.

更新
/Views/Movies/Create.cshtml 文件,增加 Rating 字段。

You can copy/paste the previous “form group” and let intelliSense help
you update the fields.

你能够 复制、粘贴 前边的 “form
group” ,并让智能提示救助您完毕字段的更新。

IntelliSense works with Tag
Helpers.

智能提醒使用 Tag
Helpers
来达成职业。

Note: In the RTM verison of Visual Studio 2017 you need to install
the Razor Language
Services for
Razor intelliSense.

笔记:今后已然是 15.3.1
版本了,此句不翻译~

This will be fixed in the next release.

此句不翻译~

北京pk赛车官网下载 9 

The app won’t work until we update the DB to include the new field. If
you run it now, you’ll get the following SqlException:

在将 新字段包括到 DB早先途序时不会不错运营的,他会抛出三个 SqlException 分外:

北京pk赛车官网下载 10北京pk赛车官网下载 11

SqlException: Invalid column name 'Rating'.

TXT Code

You’re seeing this error because the updated Movie model class is
different than the schema of the Movie table of the existing database.
(There’s no Rating column in the database table.)

你将会看出错误,因为更新后的model分裂于DB表的构造。

There are a few approaches to resolving the error:

下边是有的缓慢解决难点的主意:

1.Have the Entity Framework automatically drop and re-create the
database based on the new model class schema.

让EF自动删除并基于 模型类
布局重新创设DB布局。

This approach is very convenient early in the development cycle when you
are doing active development on a test database;

在早期的开辟周期中,当您在二个测量试验库上开荒时那是贰个老大有益的做法;

it allows you to quickly evolve the model and database schema together.

他同意你让model与db构造一齐神速迭代演变。

The downside, though, is that you lose existing data in the database —
so you don’t want to use this approach on a production database!

那般做的宿疾是会放弃现成库中的全部数据,在生育上我们是不期望利用这种格局的!

Using an initializer to automatically seed a database with test data is
often a productive way to develop an application.

使用开头化器来机关植物养育一些DB数据,是一种常动用的巩固分娩力的费用做法。

2.Explicitly modify the schema of the existing database so that it
matches the model classes.

理解于指标翻新已存在数据库的布局,让它万分代码中的模型类。

The advantage of this approach is that you keep your data.

这种做法的长处是足以让您保持数据库中已存在的数码。

You can make this change either manually or by creating a database
change script.

你可以人工的或选取脚本自动的来改换DB。

3.Use Code First Migrations to update the database schema.

接受Code
First迁移来更新数据库结构。

For this tutorial, we’ll use Code First Migrations.

在本教程中,大家会使用 Code
First 迁移的做法。

Update the SeedData class so that it provides a value for the new
column.

创新 SeedData
类,让它为新字段提供值。

A sample change is shown below, but you’ll want to make this change for
each new Movie.

日常来讲是二个变动示例,你须求为每个new Movie 加上变化。

北京pk赛车官网下载 12北京pk赛车官网下载 13

 1 new Movie
 2 
 3 {
 4 
 5     Title = "When Harry Met Sally",
 6 
 7     ReleaseDate = DateTime.Parse("1989-1-11"),
 8 
 9     Genre = "Romantic Comedy",
10 
11     Rating = "R",
12 
13     Price = 7.99M
14 
15 },

C# Code

Build the solution.

编写翻译解决方案。

From the Tools menu, select NuGet Package Manager > Package
Manager Console
.

Tools 菜单,选择 NuGet
Package Manager > Package Manager Console
子菜单:

北京pk赛车官网下载 14 

In the PMC, enter the following commands:

在 PMC
中,键入以下命令:

北京pk赛车官网下载 15北京pk赛车官网下载 16

1 Add-Migration Rating
2 
3 Update-Database

Bash Code

The Add-Migration command tells the migration framework to examine the
current Movie model with the current Movie DB schema and create the
necessary code to migrate the DB to the new model.

Add-Migration 命令告诉 迁移框架
检查当前的 Movie
类并与DB布局做相比并创办出确切的代码更新数据库使其匹配新的model类。

The name “Rating” is arbitrary and is used to name the migration file.

“Rating”
是不管三七七十四命名的,它被用来定名迁移文件名。

It’s helpful to use a meaningful name for the migration file.

利用有意义的名字命名迁移文件是丰盛有利的。

If you delete all the records in the DB, the initialize will seed the DB
and include the Rating field.

要是你剔除了DB中的数据记录,最初化类将另行种植DB并蕴藏
Rating 字段。

You can do this with the delete links in the browser or from SSOX.

你能够在浏览器上的去除链接或在
SSOX 微机分界面上这么做。

Run the app and verify you can create/edit/display movies with
a Rating field.

运路程序并检讨你能够对movie增加和删除改查新的
Rating 字段。

You should also add the Rating field to the Edit, Details,
and Delete view templates.

您同一应当在 Edit, Details,
and Delete 视图模板上平添 Rating 字段。

 

 

                                         蒙

                                    2017-08-22
11:22 周二

 

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注