代码改变世界

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

2011-11-25 14:47  汤姆大叔  阅读(5009)  评论(1编辑  收藏  举报

1. 综述

对于数据库访问,Contoso University程序要求下面的软件必须随程序一起部署,因为不属于.NET Framework:

2个数据库的数据库结构和相关的一些数据都需要部署。通常,开发系统的时候都会有一些测试数据,这些测试数据跟定不能部署到生产环境。当然,你也可能要输入一些生产环境的数据以便部署到生产环境。本章节你将配置Contoso University项目以便部署的时候包括必须的软件和数据。

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

2. SQL Server Compact与SQL Server Express

Sample程序使用SQL Server Compact 4.0,这个数据库引擎是web网站的新选择,SQL Server Compact旧版本是不能用在web环境的。SQL Server Compact提供了很多常用的新功能,和开发部署SQL Server Express及SQL Server一样。取决于你选择的主机提供商,SQL Server Compact可能更便宜,因为完整版的SQL Server需要额外付费。 SQL Server Compact不需要额外的付费,因为你可以自己将这个数据库引擎作为自己程序的一部分来部署。另外一个优点是备份和还原都十分简单,因为所有的数据都在部署站点app_data文件夹的一个.sdf文件。备份和还原仅仅是copy文件而已。

 

不过,你依然需要注意它的限制。SQL Server Compact不支持存储过程、触发器、试图、复制。(对于SQL Server 2005和SQL Server 2008支持而SQL Server Compact不支持的完整功能列表,请访问:Differences Between SQL Server Compact and SQL Server)。还有,操作SQL Server Express 和完整版SQL Server 数据库schema和数据的一些工具也不支持SQL Compact。例如,你不能使用SQL Server Management Studio或者Visual Studio数据库项目来处理SQL Server Compact数据库。当你使用SQL Server Compact的时候,Entity Framework Code First会根据你的数据模型(data model)自动创建数据库。但一旦部署以后,想保持开发环境数据库和生产环境数据库都同步的话很难,如果有像SQL Server Management Studio一样的工具的话就简单了。更多关于部署数据库差异到SQL Server Compact数据库的信息,请查看第9章。

 

SQL Server Compact是个好选择,可以用Visual Studio里的Server Explorer工具进行管理(本系列教材会将用到)。但是如果在初始部署以后需要经常改变的话,那使用SQL Server Compact 维护的成本可就大了。

 

你可以先用SQL Server Compact 然后再升级,后面的章节将告诉你如何将SQL Server Compact迁移到SQL Server Express或者完整版SQL Server。当然,如果你正在创建新的程序然后期望以后升级至完整版SQL Server,最好的选择是使用SQL Server Express。

3. 配置SQL Server Compact数据库引擎

Contoso University程序数据访问需要的软件可以通过使用下面的NuGet包来安装:

NuGet包已经帮你安装了所有该程序所需要的东西。有时候,它能修改Web.config文件或者添加build方案是需要运行的PowerShell脚本。如果你不想使用NuGet安装这些东西,你需要了解NuGet包安装的时候做的事情,以便可以手工做这些事情。

 

有个问题需要注意,SqlServerCompact NuGet包会添加一个post-build脚本到你id项目,以便copy原生的assemblies到bin目录下的x86amd64 子文件夹,但是项目默认是没有这些子文件夹的,结果就是在部署的时候这些文件不会copy到目标站点,需要手工来做这些事情。(默认的部署配置就是这样的,另外一个选择(该教程没有使用),你可以修改配置行为来达到目的,请查看Configuring Project Properties 来获取资料。不推荐这样做,因为部署的时候会带给生成环境很多文件。)

 

Solution Explorer里,点击查看所有文件Show all Files (如果还没点的话)。可能还需要点击刷新Refresh

 

展开bin文件夹可以看到有amd64x86子文件夹选择这2个文件夹,然后右键选择包含到项目里Include in Project

这时候,文件夹的图标会变回正常的,代表已经包含到项目里了。

 

4. 创建程序数据库

一般部署数据库的时候,都不会把开发库的所有数据都部署到生产环境,因为很多数据都是测试用的。例如,测试库里的学生姓名都是虚构的。另外一方面,也不能仅仅只部署数据库结构而一点数据都不部署。一些测试数据有可能是生产环境用到的真实数据,例如,数据库表里包含的年级值或真实的部门名称。

可以创建一个和开发环境不同版本的数据库,一些表包含数据,一些表不包含数据。

下面的图显示的是数据库的结构:

 

该教程假定第一次部署的时候,Student和Enrollment表是空的。其它的表上线的时候包含了一些预装载数据。下面的步骤告诉你如何用Visual Studio的SQL Server工具删除测试数据(你不必保存测试数据因为Entity Framework Code First初始化类的时候会自动生成这些数据)。

 SQL Server Compact数据库包含了App_Data文件夹的.sdf文件。Solution Explorer里,展开App_Data文件夹可以看到2个SQL Server Compact数据库.sdf文件。

 

这里是你的开发库,教程结束的时候你会有4个数据库,其中开发环境2个,生成环境2个。为了标记清楚哪个是开发环境或生成环境,你可以重命名数据库名称:开发环境的aspnet-Dev.sdf 和School-Dev.sdf,生产环境的aspnet-Prod.sdf和School-Prod.sdf。

开始修改School.sdf数据库以便只包含部署到生产环境的数据(后面的章节将重命名为School-Prod.sdf)。

Solution Explorer里,双击Server Explorer上的School.sdf数据库。

 

Server Explorer里,展开School.sdf数据库,然后展开Tables

 

Enrollment上点击右键,选择Show Table Data,然后选择所有数据行,删除。

 

弹出确认删除框的时候,点击Yes

 

同样的步骤可以删除Person表里的数据(仅限于EnrollmentDate列为null并且Discriminator列位“Student”的数据)。

 

Server Explorer里,School.sdf上点击右键选择Close ConnectionSchool.sdf已经可以部署了。

5. 创建Membership数据库

Contoso University程序使用了ASP.NET membership和Form验证来验证和授权用户。其中有一个页面只能让administrators访问,查看这个页面,请运行程序,选择Courses选项连接下的Update Credits,程序将跳转到Login页面,因为这个页面只授权给了administrators。

 

使用账户"admin"和密码"Pas$w0rd"(其中的0是数字0,而不是字符o)登陆以后,你将可以看到Update Credits页面。

 

第一次部署站点的时候,通常需要排除所有的测试账户。这里,我们需要部署的数据仅需要一个administrator账户而非其它的用户账户。与其手工删除这些测试账户,不可以创建一个新的membership数据库,并且值包含一个生产环境用到的administrator账户。这里没有自动增加种子值(因为这是为School数据库创建的新库),如果你想再部署以后继续保持测试数据以便继续开发,那就需要事先备份一下测试数据库。

Solution Explorer里,重命名App_Data 文件夹下的aspnet.sdf 文件为aspnet-Dev.sdf。(不要复制,仅仅是重命名——一会你会再创建一个新数据库)。

Project菜单,选择ASP.NET Configuration 运行Web Site Administration Tool (WAT),然后选择Security选项卡。

 

点击Create or Manage Roles然后添加一个Administrator角色。

 

导航到Security选项卡,点击Create User然后添加用户"admin"作为一个administrator。点击Create User 页面上的Create User按钮之前,确保你选上了右边的Administrator check box以便将用户设置成Administrator角色。教程里用到的密码是: "Pas$w0rd",你可以输入任意email地址。

 

关闭浏览器,返回Solution Explorer,点击刷新refresh按钮你将看到新建立的aspnet.sdf文件。

 

右键aspnet.sdf文件,选择Include in Project将它包含到项目里。

6. 重命名生产环境数据库

没有必要为生产环境重命名数据库,但是如果这样做了,解决方案将会更加清晰:

重命名aspnet.sdf为aspnet-Prod.sdf

重命名School.sdf为School-Prod.sdf

这样,这两个数据就可以部署了

7. 为开发环境设置连接字符串

当你在Visual Studio里运行程序的时候,肯定不能用-Prod版本的数据库,而是要用-Dev版本的数据库,这时候你就需要修改Web.config文件里的数据库连接字符串,使之指向到-Dev版本的连接地址。(你还没创建School-dev.sdf文件,没事!,因为Code First会检查你有没有数据库,如果没有会自动帮你创建的,你所需要做的就是填写数据库的名称)。

 

打开Web.config文件,找到connection strings节点:

<configuration>
<!-- Settings -->
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=|DataDirectory|aspnet.sdf" providerName="System.Data.SqlServerCe.4.0"/>
<add name="SchoolContext" connectionString="Data Source=|DataDirectory|School.sdf" providerName="System.Data.SqlServerCe.4.0"/>
</connectionStrings>
<!-- Settings -->
</configuration>

将"aspnet.sdf"改成"aspnet-Dev.sdf",然后将"School.sdf" 改成"School-Dev.sdf":

<configuration>
<!-- Settings -->
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=|DataDirectory|aspnet-Dev.sdf" providerName="System.Data.SqlServerCe.4.0"/>
<add name="SchoolContext" connectionString="Data Source=|DataDirectory|School-Dev.sdf" providerName="System.Data.SqlServerCe.4.0"/>
</connectionStrings>
<!-- Settings -->
</configuration>

 

运行程序,然后访问一个页面(例如:Students页)让它来访问数据库。它将导致Code First 代码创建一个新数据库School-Dev.sdf。点击Solution Explorer里的Refresh,你可以发现这个数据库,右键该数据库选项Include in project将它包含到该项目。

SQL Server Compact数据库引擎和2个生产环境的数据库都已经准备好可以部署了。下一章内容将知道你如何自动设置Web.config的transformations ,一般为开发、测试、生产环境自动设置不同的参数。(其中就有设置开发和生产环境里都用到的数据库连接字符串)。

8. 更多信息

关于NuGet 的更多信息,请访问:Manage Project Libraries with NuGetNuGet Documentation。如果你不想使用NuGet,那你需要了解如何分析NuGet包在安装的时候都有啥东西(Web.config transformations, PowerShell脚本等等),具体内容请查看: Creating and Publishing a PackageConfiguration File and Source Code Transformations