美高梅棋牌官网下载-美高梅棋牌官方版下载

大家可以在美高梅棋牌官网下载当中进行野外生存的游戏、也可以泡泡温泉、吃吃烧烤,美高梅棋牌官方版下载成为卓越不凡的超级娱乐企业巨头,注册可提款,通过该系统的运作,以最为合适的娱乐方式将客户传递到最佳平台。

从而将模型字段变更同步到数据库,我们将用E

2020-03-27 09:20栏目:美高梅棋牌官网下载
TAG:

前言

原文 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 会抛出异常。这将有助于你在开发阶段就发现错误,否则可能要到运行时才能发现这个错误了(通过一个很隐蔽的错误信息)。

2016-10-14 3 分钟阅读时长 作者 

2.查看实体类变更记录,这也是一个办法。那如果用的DB First的呢?当然也可以看,就是很麻烦。

添加一个 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。
图片 1

应用程序无法工作,直到我们更新了数据库包含新的字段。如果你现在运行程序,你将得到下面的 SqlException :
图片 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 属性字段:

图片 3图片 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 属性字段:

图片 5图片 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 字段:

图片 7图片 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.

版权声明:本文由美高梅棋牌官网下载发布于美高梅棋牌官网下载,转载请注明出处:从而将模型字段变更同步到数据库,我们将用E