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

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

时间: 2024-10-13 17:40:42

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

微软ASP.NET网站部署指南(8):部署Code-Only更新

1.  综述 初始化部署以后,你须要继续维护和更新你的网站.本章节将向你展示一个不包含数据库改变的部署升级流程.(下一章节将展示数据库改变的部署升级流程.) 提醒:假设依据本章节所做的操作出现错误信息或一些功能不正常的话,请务必check Troubleshooting页面. 2.  改动代码 为你的程序做一个简单的改动,在Instructors 列表页加入一个功能.一般选择一个Instructor的时候可以显示该Instructors 的全部课程courses. 在Instructors页面能

微软ASP.NET网站部署指南(2):部署SQL Server Compact数据库

1. 综述 对于数据库訪问,Contoso University程序要求以下的软件必须随程序一起部署.由于不属于.NET Framework: SQL Server Compact (数据库引擎) ASP.NET Universal Providers (启用ASP.NET membership以使用SQL Server Compact) Entity Framework 4.1 (Code First) 2个数据库的数据库结构和相关的一些数据都须要部署.通常.开发系统的时候都会有一些測试数据,

微软ASP.NET网站部署指南(3):使用Web.Config文件的Transformations

1. 综述 大多数程序里都会在Web.config里设置參数,而且在部署的时候须要更改. 每次都手工更改这些配置非常乏味,也easy出错. 该章节将会告诉你假设通过自己主动化更新Web.config文件来避免这些问题. 2. Web.config Transformations 与Web Deploy Parameters 有2种方式来自己主动化更新Web.config文件的设置:Web.config transformations和Web Deploy parameters. Web.conf

四 Lync Server 2013 部署指南-前端部署(1)

4.1.Lync先决条件安装 部署Lync Server 2013的前端服务器,我们需要在做前端服务器的机器上安装一些Lync必备的一些组件,具体如下: 1.安装.netframework 4.5 2.安装powershell 3.0 3.安装消息列队和桌面体验: 重启服务器以完成以上组件的安装,如下图: 4.再安装IIS的相关组件: 运行Windows Powershell,输入以下命令: Import-Module ServerManager 5.安装IIS相关组件: Add-Windows

四 Lync Server 2013 部署指南-前端部署(2)

4.3.Lync 2013部署 运行Lync2013安装程序,点击"安装或更新Lync Server 系统" 1.安装本地配置存储" 执行命令成功; 2.安装Lync Server组件; 下一步,执行安装直至完成,大概30分钟,如下图; 完成后,继续进行下一步操作. 3.请求.安装和分配证书,如下图: 请求证书; 下一步,选择立即发送: 下一步,选择证书颁发机构(CA): 下一步,本环境中没有替代凭据,直接下一步: 下一步,设置证书名称: 下一步,填写组织和地理信息,根据公司

五 Lync Server 2013 部署指南-边缘部署

前一章节已对前端服务器部署完成,内网已可以使用Lync,要能够通过外网使用Lync 2013,我们就需要部署边缘服务器,并将Lync发布到外网. 5.1.系统环境准备与先决条件安装 5.1.1  DNS准备 由于内外网域名不一致,需要在内部DNS服务器添加外部域名区域. 1.        打开DNS服务器,新建区域 选择[主要区域],如下图: 定义新区域的名称: 添加与Lync相关的A记录到新建区域xx.com,如下图: 2.        在xx.local区域添加边缘服务器内部网卡IP地址

《微软Azure云计算开发实战(2):Azure部署ASP.NET MVC 网站

今天我们继续学习Azure的实战开发,<微软Azure云计算开发实战(2):Azure部署ASP.NET MVC 网站. 在你注册完Azure的使用账户以后,下面就可以登陆Azure管理界面了.因为我们后续的开发工作都要用到Azure的资源. Azure作为公有云平台,提供了几乎所有的平台支持,操作系统包括Linux Mac OS Windows,数据库主流的都支持,网站空间,数据库,虚拟主机操作系统 几乎都有.还有流媒体服务,Hadoop集成,Bigtable等. 我们先来学习一下如何部署一个

微软ASP.NET站点部署指南(8):部署Code-Only更新

1.  综述 初始化部署以后,你需要继续维护和更新你的站点.本章节将向你展示一个不包括数据库改变的部署升级流程.(下一章节将展示数据库改变的部署升级流程.) 提醒:如果根据本章节所做的操作出现错误信息或一些功能不正常的话,请务必check Troubleshooting页面. 2.  修改代码 为你的程序做一个简单的修改,在Instructors 列表页添加一个功能,一般选择一个Instructor的时候能够显示该Instructors 的所有课程courses. 在Instructors页面可

微软ASP.NET站点部署指南(1):部署介绍

1. 综述 该系列教程指导你如何将一个ASP.NET web 程序部署到第三方的主机提供商机器上.部署的方式用的是Visual Studio的one-click发布.首先部署到开发环境的IIS上进行测试,然后再部署到生产环境(第三方的主机提供商)上. 该系列总共包括11个章节和一个troubleshooting章节:看来内容很多,有点晕吧?其实,生产环境部署的基本流程在本系列里只占很小一部分,但是在现实的环境中,了解一些看似很小但非常重要的信息是非常必要的--例如,设置目标服务器上某个文件夹的权