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

news/2024/5/12 1:26:13/文章来源:https://blog.csdn.net/weixin_33827965/article/details/94731071

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上。

转载于:https://www.cnblogs.com/gavanwanggw/p/7089164.html

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

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

相关文章

网络连接异常、网站服务器失去响应_[pc玩家]Windows10中打不开网站的问题怎么解决?...

当用户在浏览器中输入网站的域名时&#xff0c;此时将发送请求到DNS服务器以识别连接到该主机名的IP地址&#xff0c;只有正确解析了IP地址才会打开你想要访问的网站。但有时你会收到一个错误消息&#xff0c;告诉你DNS服务器没有响应。要解决这个问题&#xff0c;你可以尝试几…

此网站无法提供安全连接_怎么设置服务器才能更安全呢

作为网站的优化人员来说&#xff0c;网站的排名不稳定&#xff0c;其中有网站服务器不稳定的安全原因&#xff0c;所以在我们选择服务器的时候就要选择那些知名的主机商&#xff0c;同时在服务器的搭建上要进行有必要的设置&#xff0c;才能让服务器更安全。一、最精简的安装和…

收藏!这37个自学网站,一年让你省下十几万

一.综合类 1、学堂在线 学堂在线运行了包括包括清华大学、北京大学、复旦大学、斯坦福大学、麻省理工学院、加州大学伯克利分校等国内外几十所顶尖高校的优质课程。 2、MOOC网 中国大学MOOC(慕课)是爱课程网携手云课堂打造的在线学习平台,每一个有提升愿望的人,都可以在这里…

写给那些ASP.NET程序员:网站中的安全问题

在网络经常看到网站被挂马、主页被修改的新闻&#xff0c;其实这些问题可能是多方面的&#xff0c;服务器&#xff0c;网站程序等等。。。但是现在溢出已经被人们重视和服务器的不断完善&#xff0c;服务器系统漏洞也不是那么容易发掘&#xff0c;当然也要保证第三方的软件安全…

LogParser的IIS网站分析技巧

日志分析&#xff0c;特别是IIS日志&#xff0c;一般人都会想到LogParser工具&#xff0c;的确很强。但是命令行的操作界面令很多非专业的管理人员望而生畏&#xff0c;现在好了&#xff0c;有一个可视化的LogParser的UI工具可以使用了&#xff01; Log Parser Lizard 1.1&…

来了,又一个新的SQL刷题网站!

大家好&#xff0c;我是小五????毋庸置疑&#xff0c;SQL是数据分析师需要掌握的一个基本的技能。之前我也分享过几个SQL在线学习网&#xff0c;比如SQLZOO、XUESQL、w3resourc等。当然&#xff0c;除了学习网站还有面试刷题的网站&#xff0c;比如Leetcode、牛客网等。今天…

网站站长必须知道的两种重定向方式

网站重定向技术是每个网站站长必须知道的&#xff0c;在网站改版&#xff0c;或网站搬家的时候一定会用得上网页重定向这个技术&#xff01;现在我和大家分享网站站长必须知道的两种重定向方式! 下面我们首先来了解一下两种重定向方式的区别&#xff1a;1、什么时候我应该使用r…

网站运营,先分清web1.0与web2.0「社区运营入门系列①」

大概在八年前&#xff0c;和朋友聊天时提及Web2.0&#xff0c;这是我第一次听到这个名词。当时不记得他是怎么解释这个名词的&#xff0c;只留下了一个印象&#xff1a;这将是今后互联网的大趋势。回去后我立即就百度了一下&#xff0c;一看不要紧&#xff0c;顿时就晕菜了&…

租个服务器自己写自己的网站,自己写一个web服务器(1)

web服务器一个运行在物理服务器上的网络服务器&#xff0c;它等待客户端发送的请求。当它收到一个请求&#xff0c;它会生成一个回复并传回到客户端。一个客户端和服务器的通信可以通过HTTP协议实现。HelloWorld# coding: utf-8import socketHOST, PORT , 8888listen_socket …

移动虚拟服务器,移动网站需要什么样的虚拟主机空间

移动互联网现在发展的越来越快&#xff0c;随着智能手机的普及&#xff0c;几乎是所有的人都可以使用移动端搜索需要的内容。因此现在越来越多的企业开始注重移动端的网站。那么&#xff0c;我们如果要搭建移动网站需要怎样的虚拟主机空间呢&#xff1f;移动网站需要什么样的虚…

在 Web 服务器或网站上配置 SSL

可以在 Web 服务器或网站上配置安全套接字层 (SSL) 安全功能以检验内容完整性、用户标识和加密网络传输。 Important 只有本地计算机上 Administrators 组的成员才能执行以下过程。作为安全性最佳操作&#xff0c;请使用不属于 Administrators 组的帐户登录计算机&#xff0c;然…

为网站配置SSL

从StartSll申请免费的SSL证书,该网站只支持IE,FireFox,Opera,Safari浏览器,并且注册成功后是以证书来登陆. 注册地址:https://www.startssl.com/?app12 注:注册过程中不要关闭浏览器. 第一步:填写注册信息,注意地址需要详细.如果地址信息不全,会人工发邮件给你,让你发详细地址…

越狱的 iPhone、iPad 通过网站实现一键安装 ipa 格式的 APP 应用

1、已经 越狱 的 iPhone、iPad 设备&#xff0c;当通过其自带的 safari 浏览器访问 ipa 应用下载网站时&#xff0c;利用 itms-services 协议&#xff0c;可以一键安装 ipa 文件的 iOS 应用&#xff0c;例如&#xff1a;<a href"itms-services://?actiondownload-mani…

如何更有效使用 Rational AppScan 扫描大型网站

http://www.ibm.com/developerworks/cn/rational/r-cn-appscanlargewebsite1/index.html Rational AppScan 工作原理 Rational AppScan&#xff08;简称 AppScan&#xff09;其实是一个产品家族&#xff0c;包括众多的应用安全扫描产品&#xff0c;从开发阶段的源代码扫描的 Ap…

让你的网站在IE8的兼容模式下运行

众所周知&#xff0c;微软的Internet Explorer团队一直在致力于将IE8打造为最符合业内标准的浏览器&#xff0c;所不幸的是&#xff0c;当前并非所有的网站都认同这些标准。如果你担心你的网站在IE8的标准模式下不能正常工作的话&#xff0c;下面这些方法也许对你有所帮助&…

bootstrap4 网格布局实例_网站设计师的10个糟糕网页设计实例和常见错误

本文讨论了10个糟糕的网页设计示例和常见错误&#xff0c;以帮助网站设计人员更好地了解好的和坏的网页设计之间的区别。在我们开始之前&#xff0c;我有一个问题&#xff1a;设计网站时&#xff0c;你的首要任务是什么&#xff1f;是吸引人的外观&#xff1f;还是酷炫的效果&a…

建站之星最新0DAY

作者&#xff1a;honker90 //code public function save_profile() {$user_info ParamHolder::get(user, array());//获取数组if (sizeof($user_info) < 0) {$this->assign(json, Toolkit::jsonERR(__(Missing user information!)));return _result;}$passwd_changed f…

配置squid 反向代理提高网站性能

本文旨在介绍 squid 反向代理的工作原理的基础上&#xff0c;指出反向代理技术在提高网站访问速度&#xff0c;增强网站可用性、安全性方面有很好的用途。 现在有许多大型的门户网站都采用 squid 反向代理技术来加速网站的访问速度&#xff0c;可将不同的URL请求分发到后台不同…

网站统计中的数据收集原理及实现

网站统计中的数据收集原理及实现 网站数据统计分析工具是网站站长和运营人员经常使用的一种工具&#xff0c;比较常用的有谷歌分析、百度统计和腾讯分析等等。所有这些统计分析工具的第一步都是网站访问数据的收集。目前主流的数据收集方式基本都是基于javascript的。本文将简要…

构架高性能WEB网站的几点知识

构架高性能WEB网站的几点知识 前言&#xff1a; 对于构架高性能的web网站大家都很感兴趣&#xff0c;本文从几点粗谈高性能web网站需要考虑的问题。 HTML静态化 什么是html静态化&#xff1f; 说得简单点&#xff0c;就是把所有不是.htm或者.html的页面改为.htm或者.html 1.纯…