微软ASP.NET网站部署指南(9):部署数据库更新

news/2024/5/21 6:48:38/文章来源:https://blog.csdn.net/weixin_34212189/article/details/86243901

1.  综述

无论什么时候,程序都有可能像代码更新一样更新数据库。本章节你将进行数据库改动,測试。然后部署到測试环境和生产环境。

提醒:假设依据本章节所做的操作出现错误信息或一些功能不正常的话,请务必check Troubleshooting页面

2.  给表加入新列

本小节,将改动StudentInstructor实体共同的基类Person类。加入一个birth date字段,也要在展示页面的表格上加入一个新列。

ContosoUniversity.DAL项目,打开Person.cs在类的末尾加入例如以下的代码属性(记得,大括号中面哦)。

[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
[Required(ErrorMessage = "Birth date is required.")]
[Display(Name = "Birth Date")]
public DateTime? BirthDate { get; set; }

 

须要更新初始化类来支持新列,打开SchoolInitializer.cs文件找到var students = new List<Student>开头的代码,替换成包含birth date信息的例如以下的爱吗:

var students = new List<Student>
{new Student { FirstMidName = "Carson",   LastName = "Alexander", EnrollmentDate = DateTime.Parse("2005-09-01"), BirthDate = DateTime.Parse("1990-01-01") },new Student { FirstMidName = "Meredith", LastName = "Alonso",    EnrollmentDate = DateTime.Parse("2002-09-01"), BirthDate = DateTime.Parse("1989-01-15") },new Student { FirstMidName = "Arturo",   LastName = "Anand",     EnrollmentDate = DateTime.Parse("2003-09-01"), BirthDate = DateTime.Parse("1988-02-01") },new Student { FirstMidName = "Gytis",    LastName = "Barzdukas", EnrollmentDate = DateTime.Parse("2002-09-01"), BirthDate = DateTime.Parse("1987-03-15") },new Student { FirstMidName = "Yan",      LastName = "Li",        EnrollmentDate = DateTime.Parse("2002-09-01"), BirthDate = DateTime.Parse("1985-11-11") },new Student { FirstMidName = "Peggy",    LastName = "Justice",   EnrollmentDate = DateTime.Parse("2001-09-01"), BirthDate = DateTime.Parse("1970-11-21") },new Student { FirstMidName = "Laura",    LastName = "Norman",    EnrollmentDate = DateTime.Parse("2003-09-01"), BirthDate = DateTime.Parse("1992-10-11") },new Student { FirstMidName = "Nino",     LastName = "Olivetto",  EnrollmentDate = DateTime.Parse("2005-09-01"), BirthDate = DateTime.Parse("1986-06-06") }};

 

var instructors = new List<Instructor>开头的代码块替换成例如以下代码:

var instructors = new List<Instructor>
{new Instructor { FirstMidName = "Kim",     LastName = "Abercrombie", HireDate = DateTime.Parse("1995-03-11"), BirthDate = DateTime.Parse("1918-08-12") },new Instructor { FirstMidName = "Fadi",    LastName = "Fakhouri",    HireDate = DateTime.Parse("2002-07-06"), BirthDate = DateTime.Parse("1960-03-15") },new Instructor { FirstMidName = "Roger",   LastName = "Harui",       HireDate = DateTime.Parse("1998-07-01"), BirthDate = DateTime.Parse("1970-01-11") },new Instructor { FirstMidName = "Candace", LastName = "Kapoor",      HireDate = DateTime.Parse("2001-01-15"), BirthDate = DateTime.Parse("1975-04-11") },new Instructor { FirstMidName = "Roger",   LastName = "Zheng",       HireDate = DateTime.Parse("2004-02-12"), BirthDate = DateTime.Parse("1957-10-12") }};

 

在ContosoUniversity项目打开Instructors.aspx文件。加入一个模板字段来显示birth date,在hire date和office assignment字段之间:

<asp:TemplateField HeaderText="Birth Date" SortExpression="BirthDate"><ItemTemplate><asp:Label ID="InstructorBirthDateLabel" runat="server" Text='<%# Eval("BirthDate", "{0:d}") %>'></asp:Label></ItemTemplate><EditItemTemplate><asp:TextBox ID="InstructorBirthDateTextBox" runat="server" Text='<%# Bind("BirthDate", "{0:d}") %>'Width="7em"></asp:TextBox></EditItemTemplate>
</asp:TemplateField>

(注:假设代码变形了,能够通过CTRL+K+D来格式化代码)

Students.aspx文件。在enrollment date 之前加入一个dynamic字段显示birth date:

<asp:DynamicField DataField="BirthDate" HeaderText="Birth Date" SortExpression="BirthDate"/>

 

StudentsAdd.aspx页面, enrollment date之前加入一个bound字段显示birth date:

<asp:BoundField DataField="BirthDate" HeaderText="Birth Date"SortExpression="BirthDate"/>

 

BLL\SchoolBL.cs文件, 支持按列排序的GetStudents 方法力的switch语句里的default语句之前。加入一个case分支以支持使用birth date排序:

case "BirthDate":students = students.OrderBy(s => s.BirthDate);break;
case "BirthDate DESC":students = students.OrderByDescending(s => s.BirthDate);break;

 

执行程序訪问Students页面,你可能感觉有一点慢,那是由于Entity Framework探測到了model变了,须要删除并重建数据库,然后将初始化里的数据插入到数据库。

页面载入以后,能够看到有了一个birth date新列。

 

訪问Add StudentsInstructors页面验证是否有这个新列。

 

 

3.  部署数据库更新到測试环境

在生产环境。部署升级的时候须要保持曾经的数据,可是在測试环境则没有必要,只是为了使部署步骤和生产环境部署一样。我们还是在測试环境保存曾经的数据。以便部署步骤尽量一样。

对于生产环境。以下列出了一些须要follow的步骤:(忽略app_offline.htm步骤):

    从生产环境将School-Prod.sdf下载下来。放到Visual Studio项目的App_Data文件夹

    手工改变schema更新,手工更新数据

    又一次上传School-Prod.sdf到生产环境

    部署项目

(除了手工上传的方式,也能够使用和项目一起部署的方式,可是须要在项目属性里设置部署的时候将这个数据库也一起部署了(membership数据库除外),手工方式的优点是不用改动不论什么设置,依旧能够使用之前的one-click公布设置。

 

应用Schema改动

部署到冊数环境。你不必操心能否获得最新的copy,能够更新项目里下载下来的School-Prod.sdf来用。

看看Entity Framework里为School数据库做的改动,你能够手工改动測试环境和生产环境数据库。在Solution Explorer里双击App_Data\School.sdfServer Explorer里打开数据库连接。

Server Explorer里展开School-Dev.sdf,展开Tables-> Person->Columns。你能够看到Code First 生产的BirthDate列:

 

Properties窗体,你能够看到BirthDate列的数据类型是datetime。 名称和数据类型是唯一须要改动的。

 

Server Explorer里,右键School-Dev.sdf数据库然后选择关闭连接Close Connection

(这仅仅是数据库更新的简单样例,在真实环境里,数据库改动非常麻烦的。本章的重点不是改动或跟踪数据库变化,而是数据库改变怎么影响数据库部署过程。

普通的步骤就是:数据模型改变以后数据库须要怎么改变。以及Code First怎么自己主动更新数据库的,然后再用手工方式去做。)

下一步是手工改动School-Prod.sdf文件

Server Explorer里,展开School-Prod.sdf->Tables->Person->Columns。然后你能够看到老的表结构(没有BirthDate列)。

右键Person选择Edit Table Schema显示Edit Table对话框。

 

在Edit Table对话框,在Discriminator以下加入一个新列,输入例如以下信息:

    Column Name: BirthDate     Data Type: datetime           

 

 

LengthAllow NullsUniquePrimary Key的默认值都没问题。点击OK

数据库和新代码可以非常好的一起执行了,可是BirthDate 列在測试数据库(后面的生产环境数据库)的位置和在Entity Framework Code First 里的位置是不一样的,由于Visual Studio tool for SQL Server Compact 仅仅支持在最以下加入新列。事实上,说实话仅仅是顺序不一样而已,没有什么大的问题。

在数据库方面,Visual Studio tool for SQL Server Compact 可能还会有其它的一些限制不能和Code First.的自己主动生产功能一样,你能够通过例如以下的方式来改进:

  • 使用WebMatrix的数据库操作功能,比Visual Studio 下的SQL Server Compact 的工具功能多。

  • 使用第三方或者开源工具,比如CodePlex 上的SQL Server Compact Toolbox 和 SQL Compact data and schema script utility
  • 自己写DDL(数据定义语言)脚本来维护数据库结构。
  • 迁移至SQL Server Express或完整版SQL Server以后。但是使用SQL Server Management Studio,使用完整的数据库维护功能,也能够使用Visual Studio 2010 SQL Server database projects 或者 Database Publishing Wizard 来自己主动生产脚本(可能还有其他的原因迁移至SQL Server,请看第2章节里的叙述)。

  • 使用Entity Framework Code First Migrations。自己主动更新新的数据库以匹配新的数据模型。本章节撰写之前。该工具还没用Release,只是但是使用NuGet来安装预览器。请參看Entity Framework team blog

 

更新数据

測试数据库的结果和新代码吻合了,可是你须要加入instructor 们的生日进去。你能够手工创建并执行一个SQL脚本。本章节已经帮你创建了这个脚本,你能够执行它。

Server Explorer里, 右键School-Prod.sdf库的Person表。选择New Query

 

假设出现Add Table对话框的话,关闭它,然后将以下的SQL脚本拷贝到查询窗体的SQL窗格里:

UPDATE  Person SET   BirthDate = '1918-08-12' WHERE PersonID = 9;
UPDATE  Person SET   BirthDate = '1960-03-15' WHERE PersonID = 10;
UPDATE  Person SET   BirthDate = '1970-01-11' WHERE PersonID = 11;
UPDATE  Person SET   BirthDate = '1975-04-11' WHERE PersonID = 12;
UPDATE  Person SET   BirthDate = '1957-10-12' WHERE PersonID = 13;

右键SQL窗格,选择Execute SQL。

 

假设出现Query Definitions Differ对话框。点击Continue继续。

该消息仅仅是告诉你查询代码不能直观里表示在SQL窗格上面UI及时显示界面上。

 

查询执行了,然后弹出了5条数据被更新的确认窗体。

 

Server Explorer里,又一次右键Person选择Show Table Data检查instructors是否都有了生日数据。

 

測试数据库如今能够部署了。

复制数据库到測试网站

在Windows Explorer资源管理器里,将ContosoUniversity项目的App_Data文件夹里的School-Prod.sdf文件拷贝到測试网站的App_Data文件夹(C:\inetpub\wwwroot\contosouniversity\App_Data),覆盖原来的数据库文件。

 

和数据库更新一起部署更新代码

能够部署更新的代码了, Solution Configurations下来菜单里选择Test。 Publish profile 里也选择Test。点击Publish Web。(假设因为自己定义了工具栏操作不了的话。參考:第8章节的内容)。

 

Visual Studio部署了改动后的程序,并在Output窗体显示了成功信息。

 

执行程序http://localhost/contosouniversity来验证更新是否成功部署,在Instructors 页面能够看到真实的birth date了。

 

也能够执行Students页面 和Add Students页面来验证更新是否成功。

4.  部署数据库更新到生产环境

如今能够部署到生产环境了。除了须要先上传app_offline.htm文件防止用户使用网站以外。其他步骤和部署測试环境是一样的。

生产环境部署的过程例如以下:

  • 上传app_offline.htm文件到生产环境网站
  • 从生产环境网站下载School-Prod.sdf文件保存到本机的App_Data目录,然后再备份一份(见以下的凝视)。
  • 手工加入新列
  • 执行更新脚本(详细更新数据视真实环境须要而定)
  • 上传School-Prod.sdf文件到生产环境网站
  • 使用Visual Studio公布

凝视:数据库备份的话题就不多说了。肯定是须要常常备份的,这里指的是School-Prod.sdf 和aspnet-Prod.sdf文件。

最后一步和部署code-only 更新是一样的。在Solution Configurations下拉菜单里选择Release,在Publish profile下拉菜单里选择Production,然后点击Publish Web

 

Visual Studio部署了改动后的程序。并在Output窗体显示了成功信息。

 

验证是否正确部署之前。须要先删除app_offline.htm文件,删除以后。就能够执行网站来验证部署是否正常了。

 

如今,你已经成功将包括数据库更新的应用程序部署到測试环境和生产环境了。

下一章节讲的是怎样将SQL Server Compact数据库迁移到SQL Server Express 或者完整版SQL Server上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_794526.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

向网页设计师推荐15个很棒的网站

网络上各种各样的社区网站数不胜数&#xff0c;但专注于创意设计的很少。今天这篇文章收集了15个非常好的专注于设计的网站推荐给设计师们&#xff0c;不管是学习先进的设计理念&#xff0c;还是寻找免费资源与工具&#xff0c;这些网站都是很不错的去处&#xff0c;记得推荐和…

个人建站

建站准备&#xff1a; 1.一台公网服务器 2.一个域名 说下我自己吧&#xff0c;为什么会想建站呢&#xff0c;首先对小程序感兴趣的时候&#xff0c;发布自己的小程序需要备案过的域名&#xff0c;其次希望之后做的东西能有个桥梁去连接&#xff0c;自己有时候琢磨点东西会方…

开发网站性能分析及优化

2019独角兽企业重金招聘Python工程师标准>>> 从程序角度分析网站&#xff0c;都是个人拙见&#xff0c;记录看看。 1、网站打开体验&#xff0c;速度慢的优化方案&#xff1a; 优化方案 前端架构优化&#xff1b;调整浏览器缓存、并发、异步特性&#xff1b;…

大学三年,我靠每天在这些网站学习,进入了梦寐以求的大厂

国内 1.慕课网(https://www.imooc.com/) 慕课网的资源还是比较丰富的&#xff0c;而且免费的不少&#xff0c;初次踏进编程这坑就是从他开始。里面还有很多大佬的录制&#xff0c;如Android大佬郭霖。 2.极客学院(https://www.jikexueyuan.com/) 极客学院收费的居多&#xff…

这个神奇的网站,竟让我学会了所有数据结构

在无意中发现了一个神奇的数据结构演示网站。他以动画的形式演示数据的存储、查找、删除过程&#xff0c;相信配合上动画&#xff0c;各种数据结构也会轻松拿下。 https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 一、栈 二、各种排序 三、红黑树 四、队列

关于基于MVC网站架构的思考

关于MVC的定义 比较完整的参考&#xff1a;https://www.wikidata.org/wiki/Q44860 MVC是一种设计模式Software Design Pattern&#xff0c;不管在桌面应用亦或是网站程序中&#xff0c;都是比较常用流行的一种架构设计。M代表Model&#xff0c;V代表View&#xff0c;C代表Con…

关于使用PHP网站作采集用途的看法(其一)

记得几年前&#xff0c;“我”还是有点洞察力的“萌新”&#xff0c;曾有人建议“我”为网站修改“自动采集”功能。这的确是一个很好的想法&#xff0c;不需要额外的编程语言和IDE工具&#xff0c;自动增加网站内容的同时&#xff0c;还能为网站编辑减轻不少负担并提高编辑的创…

Python + Selenium:自动翻页爬取某图片网站指定图集

简单来说&#xff0c;爬取工作前期任务是了解目标网站的体系结构和“反爬策略”&#xff0c;然后是根据现有软硬件资源环境条件设计代码&#xff0c;反复迭代测试&#xff0c;最终实施部署。 之前&#xff0c;写过爬取图片网站的PHP和Python代码spi之类&#xff0c;通过读取HT…

Python + Selenium: 爬取某社交门户网站新闻栏目焦点

以前通过直接获取的HTML文本内容分析过&#xff0c;但是明显毫无结果。彼时深切体会到要想测试爬取“普通”反爬虫策略级别以上的网站内容&#xff0c;必须从浏览器内核级别入手。因为只有彻底模拟浏览器的行为&#xff0c;才无法被机器人100%识别为爬虫而遭到限制或拒绝服务。…

多层次应对HTTPS网站超时:selenium.common.exceptions.TimeoutException

现在网络越来越普及&#xff0c;带宽速度普遍也有较大提升。伴随网络的普及&#xff0c;同时快速增长的还有网民的数量和网络流量。网站超时响应的“通病”&#xff0c;仍然是无法完全避免的。尤其是在网络流量高峰期访问HTTPS网站&#xff0c;使用类似Selenium的浏览器内核驱动…

阿里云轻量服务器部署PHP网站(基于Lamp)

一&#xff1a;首先登陆阿里云账户购买轻量服务器&#xff08;这里就不详细介绍啦&#xff09;【轻量服务器会提供PHP,Apache,Mysql,不需要我们自己安装&#xff0c;方便很多】 如果是选择阿里云ecs服务器的话可以参考&#xff1a;https://blog.csdn.net/qiaosym/article/deta…

[转载]使用IntelliJ IDEA开发SpringMVC网站(一)开发环境

访问GitHub下载最新源码&#xff1a;https://github.com/gaussic/Sp... 文章已针对IDEA 2016做了一定的更新&#xff0c;部分更新较为重要&#xff0c;请重新阅读文章并下载最新源码。另外&#xff1a;文中的附图部分仍然为旧版本&#xff0c;请参照自身版本进行配置。 前言 由…

ASP.NET 2.0中轻松实现网站换肤

&#xff1a; 查看个人网站 查看详细资料 &#xff1c;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&#xff1e; &#xff1c;html xmlns"http://www.w3.org/1999/xh…

JQuery 的跨域方法 可跨任意网站

因发现有不少博友发园内短信问及JS的跨域问题&#xff0c;我想很多程序员的脑海里面还认为JS是不能跨域的&#xff0c;其实这是一个错误的观点&#xff1b;有很多人在网上找其解决方法&#xff0c;教其用IFRAME去解决的文章很多&#xff0c;真有那么复杂吗&#xff1f;其实很简…

推荐一个可以往blog里面加入旅行线路图的travel map网站

今天无意中发现这个网站&#xff0c;Free Travel Map Widget&#xff0c;可以很方便的做一个travel map&#xff0c;然后生成html代码放到blog里面。效果可以看看我之前的泰国和欧洲的blog更新&#xff0c;加了map。转载于:https://www.cnblogs.com/fresky/archive/2010/11/03/…

高性能网站建设之减少Http连接数

关于CSS背景图合并工具&#xff0c;请大家参看随笔&#xff1a;Css背景图合并工具功能增强&#xff08;V0.1&#xff09; 在对大访问量网站进行性能优化时&#xff0c;其中有一点是尽量减少http连接数&#xff0c;道理很明了&#xff0c;减少了单个PV的http连接数&#xff0c;…

通过脚本方式导出SharePoint网站集用户及其角色列表

这是课堂上的一个例子&#xff0c;分享出来给大家参考用。如果你管理一个或者多个网站集&#xff0c;那么这个脚本将有助于你快速地了解用户信息。 管理员们&#xff0c;懂点脚本还是很有用的哦&#xff0c;呵呵 将下面的脚本保存为一个ps1文件function Get-UsersWebPermission…

php与mysql网站开发..._Mysql 与 php动态网站开发 入门教程,mysql网站开发_PHP教程...

Mysql 与 php动态网站开发 入门教程&#xff0c;mysql网站开发这个系列的教程由表单开始写&#xff0c;因为表单可以把数据库和web 之间的交互表现得很明显。提交表单 &#xff0c;数据库记录注册信息。本教程属于基础教程。大神请略过。对于php和mysql之间的稳固性很受程序员的…

linode服务器登录网站,linode 服务器

linode 服务器 内容精选换一换云服务器组是对云服务器的一种逻辑划分&#xff0c;云服务器组中的弹性云服务器遵从同一策略。当前仅支持反亲和性&#xff0c;即同一云服务器组中的弹性云服务器分散地创建在不同的主机上&#xff0c;提高业务的可靠性。您可以使用云服务器组将业…

黑人抬棺html网站源码

黑人抬棺html源码 成品地址&#xff1a;https://www.52fenxiang.top/hrtg/ 源码下载地址&#xff1a;https://www.52fenxiang.top/thread-448-1-1.html