时间:2021-07-01 10:21:17 帮助过:9人阅读
(注:本脚本是用在本教程的环境上,Win7+IIS+SQL2008,如果你使用不同的SQL版本,请参看联机丛书)
前面部署数据库的设置仅仅是复杂文件到App_Data目录里,现在要使用SQL脚本,并且在目标数据库运行才行。实际上,Web Deploy帮你做的就是下边每个数据库的部署:
测试环境修改配置设置,打开Project Properties窗口,选择Package/Publish Web选项卡,然后在Configuration下拉菜单里选择Active (Test)或Test。
确保选择了Exclude files from the App_Data folder项,Web Deploy会读取App_Data目录下的.sdf文件,然后在SQL Server Express数据库里创建表和相应的数据,但是不需要将他们复杂到目标站点。
确保选择了Include all databases configured in Package/Publish SQL项, The Package/Publish SQL选项卡就是你配置SQL Server Express设置的地方。尽管选择了这个checkbox,但是因为你在Package/Publish SQL选项卡没选择任何一个数据库,所以没有任何影响。
选择Package/Publish SQL选项卡,设置build配置为Test,点击Import from Web.config。
Visual Studio会自动查找Web.config文件的连接字符串,找到了 membership 数据库和School数据库,并且在Database Entries表里添加了2行记录。下一步要做的就是如何部署这些数据库, Database Entries表下面的Database Entry Details 面板会显示详细的信息,每选择一个数据库,下面都会显示该数据库的部署配置信息。
配置Membership 数据库的部署设置
Database Entries里选择DefaultConnection-Deployment行,以便显示membership库的配置信息。
在Connection string for destination database里输入新SQL Server Express membership数据库的连接字符串(你可以通过Server Explorer-> Data Connections-> aspnetTest-> Properties窗口里的Connection String来获取)。
复制连接字符串到Package/Publish SQL 选项卡里的Connection string for destination database 框里。
Data Source=.\SQLExpress;Initial Catalog=aspnetTest;Integrated Security=True;Pooling=False
确保选择了Pull data and/or schema from an existing database项,它会生产脚本以便在目标数据库自动创建。
Connection string for the source database值是从Web.config文件里获取的,指向是开发用的SQL Server Compact数据库,他是用来生产脚本,然后在目标库运行的,因为是要部署生产环境数据库,所以要把名字从"aspnet-Dev.sdf"改成"aspnet-Prod.sdf"。
将Database scripting options从Schema Only改成Schema and data,因为你的数据(测试账户)也需要部署到新库里。
另外,你自己创建的赋权脚本也需要运行,在Database Scripts框里点击Add Script,然后在Select File对话框里选择你创建的Grant.sql,然后点击Open。
完成以后,Database Entries表里的DefaultConnection-Deployment的设置应该是这样的:
配置School 数据库的部署设置
接下来,选择SchoolContext-Deployment行,以配置School数据库。
同样的方式需要设置连接字符串到Connection string for destination database 框里。
Data Source=.\SQLExpress;Initial Catalog=SchoolTest;Integrated Security=True;Pooling=False
确保选择了Pull data and/or schema from an existing database项。
Connection string for the source database值是从Web.config文件里获取的,指向是开发用的SQL Server Compact数据库,他是用来生产脚本,然后在目标库运行的,因为是要部署生产环境数据库,所以要把名字从" School -Dev.sdf"改成" School -Prod.sdf"。
修改Database scripting options为Schema and data。
也需要为数据库赋予读写权限,所以也需要添加Grant.sql脚不能文件。
完成以后,Database Entries表里的SchoolContext -Deployment的设置应该是这样的:
最后,在Package/Publish SQL选项卡上保存修改。
为赋权脚本设置Transacted Mode
部署过程中,会自动生产脚本以便部署schema和数据,默认情况下,这些脚本是在一个事务里运行的,但自定义的脚本(想赋权脚本)默认不在事务里运行,如果部署存在混合事务模式的话,就有可能出现超时的情况,,本章节将指导你如何设置自定义脚本文件也在一耳光事务里运行。
在Solution Explorer,右键ContosoUniversity项目,选择Unload Project。
然后重新右键该项目,选择Edit ContosoUniversity.csproj。
Visual Studio编辑器会显示项目文件的XML内容。注意到里面有很多PropertyGroup元素(下图里省略了一些)。
第一个没有Condition
实现,它的设置和build配置无关,另外几个,有一个是Debug用的,一个是 Release用的,另外一个是Test用的,注意到,Test的这个PropertyGroup
元素里面,有个元素叫PublishDatabaseSettings
,是
你在Package/Publish SQL选项卡里设置的内容:
注意到上图标记的红色框,在Object里的Source元素是指向了你配置的自定义文件,他的Transacted属性值是False,这个就是设置事务模式的,你需要将它设置为True,设置应该是这样的:
保存关闭项目文件,然后右键解决方案里的项目,选择重新Reload Project。
Package/Publish SQL 里为SQL Express数据库设置的连接字符串只是为Web Deploy更新目标数据库用的,程序用到的连接字符串还是需要在Web.config文件里重新设置的(通过之前将的Transform)。
打开Web.Test.config文件,connectionStrings元素替换成如下代码:
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <connectionStrings> <add name="DefaultConnection" connectionString="Data Source=.\SQLExpress;Initial Catalog=aspnetTest;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/> <add name="SchoolContext" connectionString="Data Source=.\SQLExpress;Initial Catalog=SchoolTest;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/> </connectionStrings> <!-- appSettings element, comments, and system.web element --> </configuration>
最终部署结果是在Web.config 里,connectionString元素里每个add元素的providerName属性被替换成上述代码。这个和Package/Publish SQL选项卡里的是不一样的。另外字符串里添加上MultipleActiveResultSets=True,是因为这是Entity Framework和Universal Providers所必须的设置。
现在已经准备好开始部署到测试环境了。
在Solution Configurations下拉框里选择Test,Publish profile里选择Test,然后点击Publish Web。(如果你自定义了你的Visual Studio使这些工具栏的这些设置不能用的话,请参考第8章的内容)
Visual Studio部署了修改后的程序,并在Output窗口显示了成功信息。
运行程序,重新测试,添加一个student来验证数据库更新操作十分正常,再访问Update Credits页面(需要登录)来验证membership数据库是否工作正常。
测试环境部署并测试以后,可以向生产环境部署了。注意本章节前面的内容提到了Cytanium 只允许创建运行一个数据库,所以我们需要将2个数据库的所有内容都合并到一个新的数据库里。
进入Cytanium控制面板,鼠标移动到Databases上,然后选择SQL Server 2008。
在SQL Server 2008页面,点击Create Database。
输入数据库名为"School"然后点击Save保存。程序自动添加contosou前缀,所以你的真正数据库名字是contosouSchool。
同一页面,点击Create User,在Cytanium‘s服务器上创建的是混合账户,而不是平时用到的系统集成账户。你需要修改Web.config文件的连接字符串里的账户信息。这个步骤,你将创建一个用户。
在SQL User Properties 页面输入必填项:
输入用户名: ContosoUniversityUser
输入密码:Pas$w0rd.
选择contosouSchool作为默认数据库
选择contosouSchool check box
现在可以来想配置测试环境一样,来设置Package/Publish Web和Package/Publish SQL里的参数了。
打开Project Properties窗口,选择Package/Publish Web选项卡,然后在Configuration下拉菜单里选择Active (Release)或Release。
确保选择了Exclude files from the App_Data folder项.,数据库部署不需要复制App_Data文件夹里的内容,仅仅是在目标库生成并运行脚本。
确保选择了Include all databases configured in Package/Publish SQL tab项。
选择Package/Publish SQL选项卡,设置build配置为Release,和测试环境一样点击Import from Web.config。可以看到2行记录被添加到Database Entries表里了。
在为每个数据库设置部署参数的时候,与测试环境的设置唯一不同的是:测试环境需要设置2个不同的连接字符串,而生成环境需要设置相同的连接字符串,因为它们是被部署到一个生成环境数据库上的。
配置Membership 数据库部署设置
选择Database Entries 表里的DefaultConnection-Deployment 行来设置membership 数据库的部署信息。
在Connection string for destination database里输入执行刚刚创建的生成环境数据库的连接字符串信息(你可以从欢迎邮件里得到)。邮件里的地址和下面的类似:
Data Source=vserver01.cytanium.com;Initial Catalog={myDataBase};User Id={myUsername};Password={myPassword};
替换3个变量以后,字符串变成了:
Data Source=vserver01.cytanium.com;Initial Catalog=contosouSchool;User Id=ContosoUniversityUser;Password=Pas$w0rd;
复制connection string到Package/Publish SQL里的Connection string for destination database里。
确保选择了Pull data and/or schema from an existing database项
Connection string for the source database值是从Web.config文件获取的,指向了App_Data目录下的SQL Server Compact数据库,修改aspnet-Dev.sdf为aspnet-Prod.sdf。
Database scripting options项修改为Schema and data。
完成以后,DefaultConnection-Deployment的设置应该是这样的:
配置School 数据库的部署设置
接下来,选择SchoolContext-Deployment来配置School数据库的设置。
复制同样的connection string(在上面membership设置里)到Connection string for destination database。
确保选择了Pull data and/or schema from an existing database项,Connection string for the source database的值是从Web.config文件获取的, 指向的是开发库,修改School-Dev.sdf为School-Prod.sdf。
Database scripting options项修改为Schema and data。
完成以后,SchoolContext-Deployment的设置应该是这样的:
保存Package/Publish SQL 选项卡上的修改。
为了让Web.config里的数据库连接地址指向新的生产环境数据库,你修改重新设置Web.config的transfermation。连接地址和Package/Publish SQL选项卡里的地址是几乎一样的,唯一的区别是添加了一个MultipleResultSets选项。
打开Web.Release.config替换如下的内容到connectionStrings元素节点:
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <connectionStrings> <add name="DefaultConnection" connectionString="Data Source=vserver01.cytanium.com;Initial Catalog=contosouSchool;User Id=ContosoUniversityUser;Password=Pas$w0rd;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/> <add name="SchoolContext" connectionString="Data Source=vserver01.cytanium.com;Initial Catalog=contosouSchool;User Id=ContosoUniversityUser;Password=Pas$w0rd;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/> </connectionStrings> <!-- appSettings element, comments, and system.web element --> </configuration>
有时候,你可以看到一些建议,要对Web.config 文件里的connection strings进行加密,那是因为你的服务器是放在自己公司里的,部署到虚拟主机上话,你要充分信任主机提供商的安全保护能力呦。
现在可以向生产环境部署了,部署过程将读取App_Data 文件夹下的SQL Server Compact 数据库文件,然后在生产环境数据库里重新创建所有的表和数据。
在部署之前,确保上传了app_offline.htm文件,原因参考第7章内容。
首先要通过Cytanium 控制面板里的File Manager 功能将aspnet-Prod.sdf和School-Prod.sdf备份到开发环境里的App_Data目录,确保再次向生产环境部署的数据是最新的。
在Solution Configurations下拉框里选择Release,Publish profile里选择Release,然后点击Publish Web。(如果你自定义了你的Visual Studio使这些工具栏的这些设置不能用的话,请参考第8章的内容)
Visual Studio部署了修改后的程序,并在Output窗口显示了成功信息。
测试之前,需要先删除app_offline.htm文件,与此同时也可以删除App_Data目录下的sdf文件。
运行程序,重新测试,添加一个student来验证数据库更新操作十分正常,再访问Update Credits页面(需要登录)来验证membership数据库是否工作正常。
综述里介绍的内容,开发的时候最好使用和测试、生产环境同样的数据库(还记得上面说的SQL Server Express和完整版SQL Server是一样功能么?)。本小节我们将设置ContosoUniversity项目使用SQL Server Express。
最简单的方式是让Code First和membership system来帮你创建新数据库:
n 修改connection strings来指定新的SQL Express数据库
n 允许程序, Code First会自动创建程序数据库
n 点击登录,并注册一个测试账户,ASP.NET membership系统会自动帮你创建membership数据库
不过,如果你有很多测试账户需要创建的话,你肯定不想手工输入,可以将SQL Server Compact的数据迁移到SQL Server Express闪个,如果你想这么做,那请继续,如果不想这么多,请忽略这一章节,继续访问:为Web.config文件更新Connection String。
创建开发环境Membership数据库
从View菜单选择Server Explorer,右键Data Connections选择Create New SQL Server Database。
在Create New SQL Server Database对话框, Server name 里输入.\SQLExpress,New database name框里输入aspnetDev,点击OK确定。
配置数据库部署
现在需要为新数据库配置部署设置了,无需修改现在有的测试环境设置,你可以建立一个新的Build配置,以Test Build配置为基础取名为MigrateToSQLExpress。
从Visual Studio的Build菜单,选择Configuration Manager弹出Configuration Manager对话框:
在Active solution configuration框里选择New,New Solution Configuration 对话框出现以后,为新build配置输入新名称MigrateToSQLExpress,然后选择从Test复制设置。选择Create new project configurations点击OK。
打开Project Properties窗口,选择Package/Publish Web选项卡,Configuration下拉框里选择Active (MigrateToSQLExpress),选择Exclude files from the App_Data folder并确保选中Include all databases configured in Package/Publish SQL tab。
选择Package/Publish SQL选项卡,设置build配置为Active(MigrateToSQLExpress),点击Import from Web.config。
在Database Entries表里,取消选择SchoolContext-Deployment(因为不需要部署School数据库)。然后选择DefaultConnection-Deployment来配置membership 数据库的设置。
在Connection string for destination database里,输入下面列出的connection string,它指向你刚为开发环境创建的新SQL Server Express membership数据库。
Data Source=.\SQLExpress;Initial Catalog=aspnetDev;Integrated Security=True;Pooling=False;
确保选择了Pull data and/or schema from an existing database项,
Connection string for the source database的值来自Web.config文件,它指向原来的开发环境SQL Server Compact membership数据库。将Database scripting options 的项从Schema Only修改为Schema and Data。
保存Package/Publish SQL里的修改。
部署到测试环境
Solution Configurations下拉框里选择MigrateToSQLExpress build配置, Publish profile下拉框里选择Test,然后点击Publish Web。(如果你自定义了你的Visual Studio使这些工具栏的这些设置不能用的话,请参考第8章的内容)
Visual Studio部署了修改后的程序,并在Output窗口显示了成功信息。
修改Web.config 里的Connection Strings
打开Web.config文件,替换下面的代码到connectionStrings元素节点:
<connectionStrings> <add name="DefaultConnection" connectionString="Data Source=localhost\SQLExpress;Initial Catalog=aspnetDev;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient"/> <add name="SchoolContext" connectionString="Data Source=localhost\SQLExpress;Initial Catalog=SchoolDev;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient"/> </connectionStrings>
Control-F5运行,和测试、生产环境一样,添加一个student验证数据库是否能正常工作。
如果按照上面的步骤迁移了用户数据,访问Update Credits页面来验证部署是否正确,如果没有的话,创建一个administrator账户然后访问Update Credits页面来验证。