微软ASP.NET站点部署指南(11):部署SQL Server数据库更新
1. 综述
本章节展示的是如何向完整版SQL Server 数据库部署一个数据库升级。与第9章的数据库升级部署有所不同(第9章是部署到SQL Server Compact数据库)。
提醒:如果根据本章节所做的操作出现错误信息或一些功能不正常的话,请务必check Troubleshooting页面。
2. 给表添加新列
这个小节,做一个数据库修改和相应的代码更新,在部署到测试和生产环境之前,先在Visual Studio 里测试。修改内容是给Instructor 实体添加一个OfficeHours 列,然后再Instructors 页面上显示。
ContosoUniversity.DAL项目里打开Instructor.cs文件,在HireDate和Courses之间添加如下代码:
[MaxLength(50)]
public string OfficeHours { get; set; }
更新初始化器类,以便添加测试数据。打开SchoolInitializer.cs文件替换以var instructors = new List<Instructor>开头的代码块:
View Code
var instructors = new List<Instructor>
{
new Instructor { FirstMidName = "Kim", LastName = "Abercrombie", HireDate = DateTime.Parse("1995-03-11"), BirthDate = DateTime.Parse("1918-08-12"), OfficeHours = "8-9AM, 4-5PM" },
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"), OfficeHours = "6AM-6PM" },
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"), OfficeHours = "By appointment only" }
};
在ContosoUniversity项目,打开Instructors.aspx文件,在</Columns>之前添加如下代码:
<asp:TemplateField HeaderText="Office Hours">
<ItemTemplate>
<asp:Label ID="InstructorOfficeHoursLabel" runat="server" Text='<%# Eval("OfficeHours") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="InstructorOfficeHoursTextBox" runat="server" Text='<%# Bind("OfficeHours") %>'
Width="14em"></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
运行程序,访问Instructors页面,运行稍微有点慢,因为Entity Framework需要重新创建数据库和插入数据:
3. 为数据库更新创建SQL脚本
前面章节的SQL Server Compact 数据库修改部署,然后同样的方式部署测试和生产环境,但在本章这种方式不行,你需要创建SQL脚本来更新数据库,因为完整版SQL Server 数据库不能通过像SQL Server Compact 数据库一样通过复制的方式来部署。第9章指出有可以进行数据库比较然后自动创建数据库更新脚本。本章节,将已经生产的脚本提供给你。
想知道Code First为数据库做了什么,重新打开Server Explorer,你需要添加一个connection连接到新数据库SchoolDev上。
Server Explorer里,右键Data Connections,选择Add Connection,在Add Connection对话框的Server Name里输入.\SQLExpress,然后打开Select or enter a database name下拉菜单选择SchoolDev数据库。
展开SchoolDev->Tables->Person->Columns,可以看到OfficeHours列。
在Properties窗口,可以看到这个列的数据类型是nvarchar ,长度是50。
在Server Explorer里,右键SchoolDev数据库,选择Close Connection。
下面的脚本是添加一个列到Person表, table,复制这些脚本保存成AddOfficeHoursColumn.sql文件,放到SolutionFiles方案文件夹里。
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_Person
(
PersonID int NOT NULL IDENTITY (15, 1),
LastName nvarchar(50) NOT NULL,
FirstName nvarchar(50) NOT NULL,
BirthDate datetime NULL,
HireDate datetime NULL,
OfficeHours nvarchar(50) NULL,
EnrollmentDate datetime NULL,
Discriminator nvarchar(128) NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_Person SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_Person ON
GO
IF EXISTS(SELECT * FROM dbo.Person)
EXEC('INSERT INTO dbo.Tmp_Person (PersonID, LastName, FirstName, BirthDate, HireDate, EnrollmentDate, Discriminator)
SELECT PersonID, LastName, FirstName, BirthDate, HireDate, EnrollmentDate, Discriminator FROM dbo.Person WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_Person OFF
GO
ALTER TABLE dbo.CourseInstructor
DROP CONSTRAINT Course_Instructors_Target
GO
ALTER TABLE dbo.Department
DROP CONSTRAINT Department_Administrator
GO
ALTER TABLE dbo.Enrollment
DROP CONSTRAINT Student_Enrollments
补充:Web开发 , ASP.Net ,
- 更多SQLServer疑问解答:
- 配置MSSQL复制指定快照文件夹提示:不是有效的路径或文件名
- 详细解读varchar和Nvarchar区别
- SQL SERVER 2005 同步复制技术
- 进程未能大容量复制到表 解决方法
- MSSql实例教程:MSSql数据库同步
- SQLServer2000同步复制技术实现(分发和订阅)
- sqlserver
- SQLSERVER
- 测试 sqlserver 最大用户数连接
- 写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的
- sqlserver2008的安装问题。
- 为什么安装的SQL server 2008我的没有MSSQLSERVER协议啊?
- 怎样把exel表里的数据复制到sqlserver表里
- sqlserver数据库主键和外键问题
- sqlserver 中的左表连接查询和右表连接查询有啥不同?有什么用?