使用 Visual Studio ASP.NET Web 部署:部署数据库更新
作者:Tom Dykstra
本教程系列介绍如何使用 Visual Studio 2012 或 Visual Studio 2010 将 ASP.NET Web 应用程序部署到Azure App 服务 Web 应用或第三方托管提供程序。 有关该系列的信息,请参阅 该系列中的第一个教程。
概述
在本教程中,你将进行数据库更改和相关代码更改,测试 Visual Studio 中的更改,然后将更新部署到测试、过渡环境和生产环境。
本教程首先演示如何更新由 Code First 迁移 管理的数据库,然后稍后介绍如何使用 dbDacFx 提供程序更新数据库。
提醒:如果在完成本教程时收到错误消息或某些内容不起作用,请务必检查 故障排除页面。
使用 Code First 迁移 部署数据库更新
在本部分中,将出生日期列添加到Person
实体Instructor
的Student
基类。 然后更新显示讲师数据的页面,使其显示新列。 最后,部署更改以测试、暂存和生产。
将列添加到应用程序数据库中的表
在 ContosoUniversity.DAL 项目中,打开 Person.cs 并在类末尾
Person
添加以下属性(它应有两个右大括号):[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)] [Display(Name = "Birth Date")] public DateTime? BirthDate { get; set; }
接下来,更新
Seed
该方法,以便为新列提供值。 打开 Migrations\Configuration.cs ,并替换以以下代码块开头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"), OfficeAssignment = new OfficeAssignment { Location = "Smith 17" } }, new Instructor { FirstMidName = "Fadi", LastName = "Fakhouri", HireDate = DateTime.Parse("2002-07-06"), BirthDate = DateTime.Parse("1960-03-15"), OfficeAssignment = new OfficeAssignment { Location = "Gowan 27" } }, new Instructor { FirstMidName = "Roger", LastName = "Harui", HireDate = DateTime.Parse("1998-07-01"), BirthDate = DateTime.Parse("1970-01-11"), OfficeAssignment = new OfficeAssignment { Location = "Thompson 304" } }, 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.DAL 仍被选为 默认项目。
在“程序包管理器控制台”窗口中,选择 ContosoUniversity.DAL 作为默认项目,然后输入以下命令:
add-migration AddBirthDate
此命令完成后,Visual Studio 将打开定义新
DbMigration
类的类文件,并在方法中看到Up
创建新列的代码。 此方法Up
在实现更改时创建列,在Down
回滚更改时该方法将删除该列。生成解决方案,然后在程序包管理器控制台窗口中输入以下命令(确保仍选中 ContosoUniversity.DAL 项目):
update-database
Entity Framework 运行
Up
该方法,然后运行Seed
该方法。
在“讲师”页中显示新列
在 ContosoUniversity 项目中,打开 Instructors.aspx 并添加新模板字段以显示出生日期。 在雇用日期和办公室分配之间添加它:
<asp:TemplateField HeaderText="Hire Date" SortExpression="HireDate"> <ItemTemplate> <asp:Label ID="InstructorHireDateLabel" runat="server" Text='<%# Eval("HireDate", "{0:d}") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="InstructorHireDateTextBox" runat="server" Text='<%# Bind("HireDate", "{0:d}") %>' Width="7em"></asp:TextBox> </EditItemTemplate> </asp:TemplateField> <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> <asp:TemplateField HeaderText="Office Assignment" SortExpression="OfficeAssignment.Location"> <ItemTemplate> <asp:Label ID="InstructorOfficeLabel" runat="server" Text='<%# Eval("OfficeAssignment.Location") %>'></asp:Label> </ItemTemplate> <EditItemTemplate> <asp:TextBox ID="InstructorOfficeTextBox" runat="server" Text='<%# Eval("OfficeAssignment.Location") %>' Width="7em" OnInit="InstructorOfficeTextBox_Init"></asp:TextBox> </EditItemTemplate> </asp:TemplateField>
(如果代码缩进不同步,可以按 Ctrl-K,然后按 Ctrl-D 自动重新格式化文件。
运行应用程序并单击 “讲师 ”链接。
页面加载时,可以看到该页具有新的出生日期字段。
关闭浏览器。
部署数据库更新
在解决方案资源管理器选择 ContosoUniversity 项目。
在 “Web 一键发布 ”工具栏中,单击“ 测试 发布配置文件”,然后单击“ 发布 Web”。 (如果工具栏已禁用,请在 中选择 ContosoUniversity 项目解决方案资源管理器.)
Visual Studio 将部署更新的应用程序,浏览器将打开主页。
运行“讲师”页,验证是否已成功部署更新。
当应用程序尝试访问此页面的数据库时,Code First 将更新数据库架构并运行
Seed
该方法。 当页面显示时,会看到包含日期的预期 “出生日期 ”列。在“Web 一键发布”工具栏中,单击“暂存发布配置文件”,然后单击“发布 Web”。
在 过渡阶段中运行“讲师” 页,验证是否已成功部署更新。
在“Web 一键发布”工具栏中,单击“生产发布配置文件”,然后单击“发布 Web”。
在 生产环境中运行“讲师 ”页,验证是否已成功部署更新。
对于包含数据库更改的实际生产应用程序更新,通常使用 app_offline.htm 在部署期间使应用程序脱机,如上一教程所示。
使用 dbDacFx 提供程序部署数据库更新
在本部分中,你将向成员身份数据库中的用户表添加一个注释列,并创建一个页面,以便显示和编辑每个用户的注释。 然后部署更改以测试、暂存和生产。
将列添加到成员资格数据库中的表
在 Visual Studio 中,打开 SQL Server 对象资源管理器。
展开 (localdb)\v11.0,展开 “数据库”,展开 aspnet-ContosoUniversity (而不是 aspnet-ContosoUniversity-Prod),然后展开 “表”。
如果未在 SQL Server 节点下看到 (localdb)\v11.0,请右键单击 SQL Server 节点,然后单击“添加 SQL Server”。 在 “连接到服务器 ”对话框中输入 (localdb)\v11.0 作为 服务器名称,然后单击“ 连接”。
如果未看到 aspnet-ContosoUniversity,请运行项目并使用管理员凭据登录(密码是 devpwd),然后刷新 SQL Server 对象资源管理器窗口。
右键单击“用户”表,然后单击“视图设计器”。
在设计器中,添加注释列,使其 nvarchar(128)和可为 null,然后单击“更新”。
在 “预览数据库更新 ”框中,单击“ 更新数据库”。
创建页面以显示和编辑新列
在解决方案资源管理器中,右键单击 ContosoUniversity 项目中的 Account 文件夹,单击“添加”,然后单击“新建项”。
使用母版页创建新的 Web 窗体,并将其命名为UserInfo.aspx。 接受默认 的 Site.Master 文件作为母版页。
将以下标记复制到
MainContent
Content
元素(3Content
个元素中的最后一个):<h2>User Information</h2> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DefaultConnection %>" SelectCommand="SELECT UserId, UserName, Comments FROM [Users]" UpdateCommand="UPDATE [Users] SET [UserName] = @UserName, [Comments] = @Comments WHERE [UserId] = @UserId"> <DeleteParameters> <asp:Parameter Name="UserId" Type="Object" /> </DeleteParameters> <UpdateParameters> <asp:Parameter Name="UserId" Type="Object" /> <asp:Parameter Name="UserName" Type="String" /> <asp:Parameter Name="Comments" Type="String" /> </UpdateParameters> </asp:SqlDataSource> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="UserId" DataSourceID="SqlDataSource1"> <Columns> <asp:CommandField ShowEditButton="True" /> <asp:BoundField DataField="UserName" HeaderText="UserName" SortExpression="UserName" /> <asp:BoundField DataField="Comments" HeaderText="Comments" SortExpression="Comments" /> </Columns> </asp:GridView>
右键单击 UserInfo.aspx 页,然后单击 “在浏览器中查看”。
使用 管理员 用户凭据(密码是 devpwd)登录,并向用户添加一些注释,以验证页面是否正常工作。
关闭浏览器。
部署数据库更新
若要使用 dbDacFx 提供程序进行部署,只需在发布配置文件中选择 “更新数据库 ”选项。 但是,对于使用此选项时的初始部署,还配置了一些要运行的其他 SQL 脚本:这些脚本仍在配置文件中,并且必须阻止它们再次运行。
右键单击 ContosoUniversity 项目并单击“发布”,打开发布 Web 向导。
选择测试配置文件。
单击“设置”选项卡。
在 DefaultConnection 下,选择“更新数据库”。
禁用配置为为初始部署运行的其他脚本:
- 单击“ 配置数据库更新”。
- 在“配置数据库更新”对话框中,清除Grant.sql和aspnet-data-dev.sql旁边的复选框。
- 单击“关闭” 。
单击 预览 选项卡。
在“数据库”和“DefaultConnection”右侧,单击“预览数据库”链接。
预览窗口显示将在目标数据库中运行的脚本,以使该数据库架构与源数据库的架构匹配。 该脚本包括添加新列的 ALTER TABLE 命令。
关闭“ 数据库预览 ”对话框,然后单击“ 发布”。
Visual Studio 将部署更新的应用程序,浏览器将打开主页。
运行 UserInfo 页(将帐户/UserInfo.aspx添加到主页 URL),验证是否已成功部署更新。 必须通过输入 管理员 和 devpwd 登录。
默认情况下不会部署表中的数据,并且未配置要运行的数据部署脚本,因此找不到在开发中添加的注释。 现在可以在暂存中添加一个新注释,以验证是否已将更改部署到数据库,并且页面正常工作。
按照相同的过程部署到过渡和生产环境。
不要忘记禁用额外的脚本。 与测试配置文件相比,唯一的区别在于,在过渡配置文件和生产配置文件中仅禁用一个脚本,因为它们配置为仅 运行aspnet-prod-data.sql。
暂存和生产凭据是管理员和 prodpwd。
对于包含数据库更改的实际生产应用程序更新,通常通过在发布和删除应用程序之前上传app_offline.htm,使应用程序在部署期间脱机,如上一教程所示。
总结
现在,你已部署了一个应用程序更新,其中包含使用 Code First 迁移 和 dbDacFx 提供程序的数据库更改。
下一教程演示如何使用命令行执行部署。