微軟ASP.NET站點(diǎn)部署指南(10):遷移至SQL Server
2011-12-02 09:05 湯姆大叔 閱讀(3246) 評(píng)論(4) 收藏 舉報(bào)1. 綜述
第2章的部署SQL Server Compact和第9章的部署數(shù)據(jù)庫(kù)更新里解釋了為什么最終要升級(jí)到完整版SQL Server 。本章節(jié)將告訴你如何來(lái)做。
SQL Server Express和完整版SQL Server
一旦你決定使用完整版SQL Server,你需要在開(kāi)發(fā)和測(cè)試環(huán)境使用SQL Server Express 或者完整版SQL Server。在工具支持和數(shù)據(jù)庫(kù)引擎功能上,SQL Server Compact 和其它版本的SQL Server都是有區(qū)別的,可以導(dǎo)致不同的代碼產(chǎn)生不同的結(jié)果。
通常在開(kāi)發(fā)和測(cè)試環(huán)境(本機(jī))是選擇SQL Server Express,因?yàn)樗敲赓M(fèi)的,而且隨Visual Studio一起默認(rèn)安裝的。和SQL Server Compact不一樣, SQL Server Express和完整版SQL Server的數(shù)據(jù)庫(kù)引擎是一樣的。也就是說(shuō)再SQL Server Express測(cè)試的結(jié)果和在生產(chǎn)環(huán)境完整版SQL Server上測(cè)試的結(jié)果是一樣的。完整版SQL Server的工具大部分都可以在SQL Server Express上用(除了SQL Server Profiler)。 而且SQL Server Express也完整地支持存儲(chǔ)過(guò)程,視圖,觸發(fā)器,復(fù)制功能。(由于虛擬主機(jī)一般都不支持SQL Server Express,所以生產(chǎn)環(huán)境你需要使用完整版的SQL Server。)
合并數(shù)據(jù)庫(kù)
在Contoso University程序里有2個(gè)SQL Server Compact數(shù)據(jù)庫(kù),一個(gè)是membership 數(shù)據(jù)庫(kù)(aspnet.sdf),另一個(gè)是程序數(shù)據(jù)庫(kù)(School.sdf)。遷移的時(shí)候你可以將它們繼續(xù)保持2個(gè)數(shù)據(jù)庫(kù),也可以合并成一個(gè)數(shù)據(jù)庫(kù)。為了使用方便,你可能想讓2個(gè)庫(kù)合并在一起,還有一個(gè)原因是虛擬主機(jī)提供商,一個(gè)賬戶(hù)可能只允許創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),本教程用的提供商就是這樣的。
在本章節(jié),你可以安裝如下方式遷移你的數(shù)據(jù)庫(kù):
在開(kāi)發(fā)和測(cè)試環(huán)境遷移到2個(gè)SQL Server Express數(shù)據(jù)庫(kù)
在生產(chǎn)環(huán)境遷移到一個(gè)完整版的數(shù)據(jù)庫(kù)
提醒:如果根據(jù)本章節(jié)所做的操作出現(xiàn)錯(cuò)誤信息或一些功能不正常的話,請(qǐng)務(wù)必check Troubleshooting頁(yè)面。
2. 為測(cè)試環(huán)境創(chuàng)建SQL Server Express數(shù)據(jù)庫(kù)
向測(cè)試環(huán)境部署QL Server Express數(shù)據(jù)庫(kù)之前,你需要手工創(chuàng)建這些數(shù)據(jù)庫(kù),但不需要手工創(chuàng)建表和插入數(shù)據(jù),Web Deploy會(huì)自動(dòng)幫你做這些工作。
從View按鈕選擇Server Explorer,右鍵Data Connections然后選擇Create New SQL Server Database。

在Create New SQL Server Database對(duì)話框的Server name框里輸入".\SQLExpress",在New database name 框里輸入"aspnetTest",然后確定OK。

用同樣的步驟創(chuàng)建"SchoolTest"數(shù)據(jù)庫(kù)。(使用Test后綴,是因?yàn)殚_(kāi)發(fā)環(huán)境和測(cè)試環(huán)境在一個(gè)機(jī)器上,我們需要讓不同的數(shù)據(jù)庫(kù)運(yùn)行在不同的實(shí)例上。)
Server Explorer里顯示了創(chuàng)建的2個(gè)數(shù)據(jù)庫(kù)。

3. 為新數(shù)據(jù)庫(kù)創(chuàng)建授權(quán)腳本
開(kāi)發(fā)機(jī)的IIS上運(yùn)行程序的時(shí)候,訪問(wèn)數(shù)據(jù)庫(kù)使用的是默認(rèn)應(yīng)用程序池。但是,默認(rèn)的應(yīng)用程序池認(rèn)證是沒(méi)有權(quán)限打開(kāi)數(shù)據(jù)庫(kù)的。所以需要運(yùn)行一個(gè)授權(quán)腳本來(lái)授權(quán)。本小節(jié),你需要?jiǎng)?chuàng)建這個(gè)腳本,過(guò)后運(yùn)行它以便在IIS上運(yùn)行的時(shí)候能打開(kāi)數(shù)據(jù)庫(kù)。
在解決方案的SolutionFiles文件夾里,創(chuàng)建一個(gè)Grant.sql文件,復(fù)雜下面的代碼到該文件中,保存并關(guān)閉:
IF NOT EXISTS (SELECT name FROM sys.server_principals WHERE name = 'IIS APPPOOL\DefaultAppPool')
BEGIN
CREATE LOGIN [IIS APPPOOL\DefaultAppPool]
FROM WINDOWS WITH DEFAULT_DATABASE=[master],
DEFAULT_LANGUAGE=[us_english]
END
GO
CREATE USER [ContosoUniversityUser]
FOR LOGIN [IIS APPPOOL\DefaultAppPool]
GO
EXEC sp_addrolemember 'db_datareader', 'ContosoUniversityUser'
GO
EXEC sp_addrolemember 'db_datawriter', 'ContosoUniversityUser'
GO
(注:本腳本是用在本教程的環(huán)境上,Win7+IIS+SQL2008,如果你使用不同的SQL版本,請(qǐng)參看聯(lián)機(jī)叢書(shū))
4. 為測(cè)試環(huán)境配置數(shù)據(jù)庫(kù)部署
前面部署數(shù)據(jù)庫(kù)的設(shè)置僅僅是復(fù)雜文件到App_Data目錄里,現(xiàn)在要使用SQL腳本,并且在目標(biāo)數(shù)據(jù)庫(kù)運(yùn)行才行。實(shí)際上,Web Deploy幫你做的就是下邊每個(gè)數(shù)據(jù)庫(kù)的部署:
- 創(chuàng)建一個(gè)SQL腳本,用于向目標(biāo)庫(kù)里創(chuàng)建庫(kù)結(jié)構(gòu)(表,列,約束等等)
- 創(chuàng)建一個(gè)SQL腳本,用于向目標(biāo)庫(kù)插入數(shù)據(jù)庫(kù)
- 在目標(biāo)庫(kù)里運(yùn)行這些腳本
測(cè)試環(huán)境修改配置設(shè)置,打開(kāi)Project Properties窗口,選擇Package/Publish Web選項(xiàng)卡,然后在Configuration下拉菜單里選擇Active (Test)或Test。
確保選擇了Exclude files from the App_Data folder項(xiàng),Web Deploy會(huì)讀取App_Data目錄下的.sdf文件,然后在SQL Server Express數(shù)據(jù)庫(kù)里創(chuàng)建表和相應(yīng)的數(shù)據(jù),但是不需要將他們復(fù)雜到目標(biāo)站點(diǎn)。
確保選擇了Include all databases configured in Package/Publish SQL項(xiàng), The Package/Publish SQL選項(xiàng)卡就是你配置SQL Server Express設(shè)置的地方。盡管選擇了這個(gè)checkbox,但是因?yàn)槟阍赑ackage/Publish SQL選項(xiàng)卡沒(méi)選擇任何一個(gè)數(shù)據(jù)庫(kù),所以沒(méi)有任何影響。

選擇Package/Publish SQL選項(xiàng)卡,設(shè)置build配置為Test,點(diǎn)擊Import from Web.config。

Visual Studio會(huì)自動(dòng)查找Web.config文件的連接字符串,找到了 membership 數(shù)據(jù)庫(kù)和School數(shù)據(jù)庫(kù),并且在Database Entries表里添加了2行記錄。下一步要做的就是如何部署這些數(shù)據(jù)庫(kù), Database Entries表下面的Database Entry Details 面板會(huì)顯示詳細(xì)的信息,每選擇一個(gè)數(shù)據(jù)庫(kù),下面都會(huì)顯示該數(shù)據(jù)庫(kù)的部署配置信息。

配置Membership 數(shù)據(jù)庫(kù)的部署設(shè)置
Database Entries里選擇DefaultConnection-Deployment行,以便顯示membership庫(kù)的配置信息。
在Connection string for destination database里輸入新SQL Server Express membership數(shù)據(jù)庫(kù)的連接字符串(你可以通過(guò)Server Explorer-> Data Connections-> aspnetTest-> Properties窗口里的Connection String來(lái)獲取)。

復(fù)制連接字符串到Package/Publish SQL 選項(xiàng)卡里的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項(xiàng),它會(huì)生產(chǎn)腳本以便在目標(biāo)數(shù)據(jù)庫(kù)自動(dòng)創(chuàng)建。
Connection string for the source database值是從Web.config文件里獲取的,指向是開(kāi)發(fā)用的SQL Server Compact數(shù)據(jù)庫(kù),他是用來(lái)生產(chǎn)腳本,然后在目標(biāo)庫(kù)運(yùn)行的,因?yàn)槭且渴鹕a(chǎn)環(huán)境數(shù)據(jù)庫(kù),所以要把名字從"aspnet-Dev.sdf"改成"aspnet-Prod.sdf"。
將Database scripting options從Schema Only改成Schema and data,因?yàn)槟愕臄?shù)據(jù)(測(cè)試賬戶(hù))也需要部署到新庫(kù)里。
另外,你自己創(chuàng)建的賦權(quán)腳本也需要運(yùn)行,在Database Scripts框里點(diǎn)擊Add Script,然后在Select File對(duì)話框里選擇你創(chuàng)建的Grant.sql,然后點(diǎn)擊Open。

完成以后,Database Entries表里的DefaultConnection-Deployment的設(shè)置應(yīng)該是這樣的:

配置School 數(shù)據(jù)庫(kù)的部署設(shè)置
接下來(lái),選擇SchoolContext-Deployment行,以配置School數(shù)據(jù)庫(kù)。
同樣的方式需要設(shè)置連接字符串到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項(xiàng)。
Connection string for the source database值是從Web.config文件里獲取的,指向是開(kāi)發(fā)用的SQL Server Compact數(shù)據(jù)庫(kù),他是用來(lái)生產(chǎn)腳本,然后在目標(biāo)庫(kù)運(yùn)行的,因?yàn)槭且渴鹕a(chǎn)環(huán)境數(shù)據(jù)庫(kù),所以要把名字從" School -Dev.sdf"改成" School -Prod.sdf"。
修改Database scripting options為Schema and data。
也需要為數(shù)據(jù)庫(kù)賦予讀寫(xiě)權(quán)限,所以也需要添加Grant.sql腳不能文件。
完成以后,Database Entries表里的SchoolContext -Deployment的設(shè)置應(yīng)該是這樣的:

最后,在Package/Publish SQL選項(xiàng)卡上保存修改。
為賦權(quán)腳本設(shè)置Transacted Mode
部署過(guò)程中,會(huì)自動(dòng)生產(chǎn)腳本以便部署schema和數(shù)據(jù),默認(rèn)情況下,這些腳本是在一個(gè)事務(wù)里運(yùn)行的,但自定義的腳本(想賦權(quán)腳本)默認(rèn)不在事務(wù)里運(yùn)行,如果部署存在混合事務(wù)模式的話,就有可能出現(xiàn)超時(shí)的情況,,本章節(jié)將指導(dǎo)你如何設(shè)置自定義腳本文件也在一耳光事務(wù)里運(yùn)行。
在Solution Explorer,右鍵ContosoUniversity項(xiàng)目,選擇Unload Project。

然后重新右鍵該項(xiàng)目,選擇Edit ContosoUniversity.csproj。

Visual Studio編輯器會(huì)顯示項(xiàng)目文件的XML內(nèi)容。注意到里面有很多PropertyGroup元素(下圖里省略了一些)。

第一個(gè)沒(méi)有Condition 實(shí)現(xiàn),它的設(shè)置和build配置無(wú)關(guān),另外幾個(gè),有一個(gè)是Debug用的,一個(gè)是 Release用的,另外一個(gè)是Test用的,注意到,Test的這個(gè)PropertyGroup 元素里面,有個(gè)元素叫PublishDatabaseSettings,是你在Package/Publish SQL選項(xiàng)卡里設(shè)置的內(nèi)容:

注意到上圖標(biāo)記的紅色框,在Object里的Source元素是指向了你配置的自定義文件,他的Transacted屬性值是False,這個(gè)就是設(shè)置事務(wù)模式的,你需要將它設(shè)置為T(mén)rue,設(shè)置應(yīng)該是這樣的:

保存關(guān)閉項(xiàng)目文件,然后右鍵解決方案里的項(xiàng)目,選擇重新Reload Project。

5. 為測(cè)試庫(kù)的連接字符串創(chuàng)建Web.Config Transform
Package/Publish SQL 里為SQL Express數(shù)據(jù)庫(kù)設(shè)置的連接字符串只是為Web Deploy更新目標(biāo)數(shù)據(jù)庫(kù)用的,程序用到的連接字符串還是需要在Web.config文件里重新設(shè)置的(通過(guò)之前將的Transform)。
打開(kāi)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>
最終部署結(jié)果是在Web.config 里,connectionString元素里每個(gè)add元素的providerName屬性被替換成上述代碼。這個(gè)和Package/Publish SQL選項(xiàng)卡里的是不一樣的。另外字符串里添加上MultipleActiveResultSets=True,是因?yàn)檫@是Entity Framework和Universal Providers所必須的設(shè)置。
6. 部署到測(cè)試環(huán)境
現(xiàn)在已經(jīng)準(zhǔn)備好開(kāi)始部署到測(cè)試環(huán)境了。
在Solution Configurations下拉框里選擇Test,Publish profile里選擇Test,然后點(diǎn)擊Publish Web。(如果你自定義了你的Visual Studio使這些工具欄的這些設(shè)置不能用的話,請(qǐng)參考第8章的內(nèi)容)

Visual Studio部署了修改后的程序,并在Output窗口顯示了成功信息。

運(yùn)行程序,重新測(cè)試,添加一個(gè)student來(lái)驗(yàn)證數(shù)據(jù)庫(kù)更新操作十分正常,再訪問(wèn)Update Credits頁(yè)面(需要登錄)來(lái)驗(yàn)證membership數(shù)據(jù)庫(kù)是否工作正常。
7. 為生產(chǎn)環(huán)境創(chuàng)建SQL Server數(shù)據(jù)庫(kù)
測(cè)試環(huán)境部署并測(cè)試以后,可以向生產(chǎn)環(huán)境部署了。注意本章節(jié)前面的內(nèi)容提到了Cytanium 只允許創(chuàng)建運(yùn)行一個(gè)數(shù)據(jù)庫(kù),所以我們需要將2個(gè)數(shù)據(jù)庫(kù)的所有內(nèi)容都合并到一個(gè)新的數(shù)據(jù)庫(kù)里。
進(jìn)入Cytanium控制面板,鼠標(biāo)移動(dòng)到Databases上,然后選擇SQL Server 2008。

在SQL Server 2008頁(yè)面,點(diǎn)擊Create Database。

輸入數(shù)據(jù)庫(kù)名為"School"然后點(diǎn)擊Save保存。程序自動(dòng)添加contosou前綴,所以你的真正數(shù)據(jù)庫(kù)名字是contosouSchool。

同一頁(yè)面,點(diǎn)擊Create User,在Cytanium's服務(wù)器上創(chuàng)建的是混合賬戶(hù),而不是平時(shí)用到的系統(tǒng)集成賬戶(hù)。你需要修改Web.config文件的連接字符串里的賬戶(hù)信息。這個(gè)步驟,你將創(chuàng)建一個(gè)用戶(hù)。

在SQL User Properties 頁(yè)面輸入必填項(xiàng):
輸入用戶(hù)名: ContosoUniversityUser
輸入密碼:Pas$w0rd.
選擇contosouSchool作為默認(rèn)數(shù)據(jù)庫(kù)
選擇contosouSchool check box

8. 為生產(chǎn)環(huán)境創(chuàng)建配置數(shù)據(jù)庫(kù)部署
現(xiàn)在可以來(lái)想配置測(cè)試環(huán)境一樣,來(lái)設(shè)置Package/Publish Web和Package/Publish SQL里的參數(shù)了。
打開(kāi)Project Properties窗口,選擇Package/Publish Web選項(xiàng)卡,然后在Configuration下拉菜單里選擇Active (Release)或Release。
確保選擇了Exclude files from the App_Data folder項(xiàng).,數(shù)據(jù)庫(kù)部署不需要復(fù)制App_Data文件夾里的內(nèi)容,僅僅是在目標(biāo)庫(kù)生成并運(yùn)行腳本。
確保選擇了Include all databases configured in Package/Publish SQL tab項(xiàng)。

選擇Package/Publish SQL選項(xiàng)卡,設(shè)置build配置為Release,和測(cè)試環(huán)境一樣點(diǎn)擊Import from Web.config。可以看到2行記錄被添加到Database Entries表里了。
在為每個(gè)數(shù)據(jù)庫(kù)設(shè)置部署參數(shù)的時(shí)候,與測(cè)試環(huán)境的設(shè)置唯一不同的是:測(cè)試環(huán)境需要設(shè)置2個(gè)不同的連接字符串,而生成環(huán)境需要設(shè)置相同的連接字符串,因?yàn)樗鼈兪潜徊渴鸬揭粋€(gè)生成環(huán)境數(shù)據(jù)庫(kù)上的。
配置Membership 數(shù)據(jù)庫(kù)部署設(shè)置
選擇Database Entries 表里的DefaultConnection-Deployment 行來(lái)設(shè)置membership 數(shù)據(jù)庫(kù)的部署信息。
在Connection string for destination database里輸入執(zhí)行剛剛創(chuàng)建的生成環(huán)境數(shù)據(jù)庫(kù)的連接字符串信息(你可以從歡迎郵件里得到)。郵件里的地址和下面的類(lèi)似:
Data Source=vserver01.cytanium.com;Initial Catalog={myDataBase};User Id={myUsername};Password={myPassword};
替換3個(gè)變量以后,字符串變成了:
Data Source=vserver01.cytanium.com;Initial Catalog=contosouSchool;User Id=ContosoUniversityUser;Password=Pas$w0rd;
復(fù)制connection string到Package/Publish SQL里的Connection string for destination database里。
確保選擇了Pull data and/or schema from an existing database項(xiàng)
Connection string for the source database值是從Web.config文件獲取的,指向了App_Data目錄下的SQL Server Compact數(shù)據(jù)庫(kù),修改aspnet-Dev.sdf為aspnet-Prod.sdf。
Database scripting options項(xiàng)修改為Schema and data。
完成以后,DefaultConnection-Deployment的設(shè)置應(yīng)該是這樣的:

配置School 數(shù)據(jù)庫(kù)的部署設(shè)置
接下來(lái),選擇SchoolContext-Deployment來(lái)配置School數(shù)據(jù)庫(kù)的設(shè)置。
復(fù)制同樣的connection string(在上面membership設(shè)置里)到Connection string for destination database。
確保選擇了Pull data and/or schema from an existing database項(xiàng),Connection string for the source database的值是從Web.config文件獲取的, 指向的是開(kāi)發(fā)庫(kù),修改School-Dev.sdf為School-Prod.sdf。
Database scripting options項(xiàng)修改為Schema and data。
完成以后,SchoolContext-Deployment的設(shè)置應(yīng)該是這樣的:

保存Package/Publish SQL 選項(xiàng)卡上的修改。
9. 為生產(chǎn)庫(kù)的連接字符串創(chuàng)建Web.Config Transform
為了讓Web.config里的數(shù)據(jù)庫(kù)連接地址指向新的生產(chǎn)環(huán)境數(shù)據(jù)庫(kù),你修改重新設(shè)置Web.config的transfermation。連接地址和Package/Publish SQL選項(xiàng)卡里的地址是幾乎一樣的,唯一的區(qū)別是添加了一個(gè)MultipleResultSets選項(xiàng)。
打開(kāi)Web.Release.config替換如下的內(nèi)容到connectionStrings元素節(jié)點(diǎn):
<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>
有時(shí)候,你可以看到一些建議,要對(duì)Web.config 文件里的connection strings進(jìn)行加密,那是因?yàn)槟愕姆?wù)器是放在自己公司里的,部署到虛擬主機(jī)上話,你要充分信任主機(jī)提供商的安全保護(hù)能力呦。
10. 部署到生產(chǎn)環(huán)境
現(xiàn)在可以向生產(chǎn)環(huán)境部署了,部署過(guò)程將讀取App_Data 文件夾下的SQL Server Compact 數(shù)據(jù)庫(kù)文件,然后在生產(chǎn)環(huán)境數(shù)據(jù)庫(kù)里重新創(chuàng)建所有的表和數(shù)據(jù)。
在部署之前,確保上傳了app_offline.htm文件,原因參考第7章內(nèi)容。
首先要通過(guò)Cytanium 控制面板里的File Manager 功能將aspnet-Prod.sdf和School-Prod.sdf備份到開(kāi)發(fā)環(huán)境里的App_Data目錄,確保再次向生產(chǎn)環(huán)境部署的數(shù)據(jù)是最新的。
在Solution Configurations下拉框里選擇Release,Publish profile里選擇Release,然后點(diǎn)擊Publish Web。(如果你自定義了你的Visual Studio使這些工具欄的這些設(shè)置不能用的話,請(qǐng)參考第8章的內(nèi)容)
Visual Studio部署了修改后的程序,并在Output窗口顯示了成功信息。

測(cè)試之前,需要先刪除app_offline.htm文件,與此同時(shí)也可以刪除App_Data目錄下的sdf文件。
運(yùn)行程序,重新測(cè)試,添加一個(gè)student來(lái)驗(yàn)證數(shù)據(jù)庫(kù)更新操作十分正常,再訪問(wèn)Update Credits頁(yè)面(需要登錄)來(lái)驗(yàn)證membership數(shù)據(jù)庫(kù)是否工作正常。
11. 開(kāi)發(fā)環(huán)境切換到SQL Server Express
綜述里介紹的內(nèi)容,開(kāi)發(fā)的時(shí)候最好使用和測(cè)試、生產(chǎn)環(huán)境同樣的數(shù)據(jù)庫(kù)(還記得上面說(shuō)的SQL Server Express和完整版SQL Server是一樣功能么?)。本小節(jié)我們將設(shè)置ContosoUniversity項(xiàng)目使用SQL Server Express。
最簡(jiǎn)單的方式是讓Code First和membership system來(lái)幫你創(chuàng)建新數(shù)據(jù)庫(kù):
n 修改connection strings來(lái)指定新的SQL Express數(shù)據(jù)庫(kù)
n 允許程序, Code First會(huì)自動(dòng)創(chuàng)建程序數(shù)據(jù)庫(kù)
n 點(diǎn)擊登錄,并注冊(cè)一個(gè)測(cè)試賬戶(hù),ASP.NET membership系統(tǒng)會(huì)自動(dòng)幫你創(chuàng)建membership數(shù)據(jù)庫(kù)
不過(guò),如果你有很多測(cè)試賬戶(hù)需要?jiǎng)?chuàng)建的話,你肯定不想手工輸入,可以將SQL Server Compact的數(shù)據(jù)遷移到SQL Server Express閃個(gè),如果你想這么做,那請(qǐng)繼續(xù),如果不想這么多,請(qǐng)忽略這一章節(jié),繼續(xù)訪問(wèn):為Web.config文件更新Connection String。
創(chuàng)建開(kāi)發(fā)環(huán)境Membership數(shù)據(jù)庫(kù)
從View菜單選擇Server Explorer,右鍵Data Connections選擇Create New SQL Server Database。
在Create New SQL Server Database對(duì)話框, Server name 里輸入.\SQLExpress,New database name框里輸入aspnetDev,點(diǎn)擊OK確定。
配置數(shù)據(jù)庫(kù)部署
現(xiàn)在需要為新數(shù)據(jù)庫(kù)配置部署設(shè)置了,無(wú)需修改現(xiàn)在有的測(cè)試環(huán)境設(shè)置,你可以建立一個(gè)新的Build配置,以Test Build配置為基礎(chǔ)取名為MigrateToSQLExpress。
從Visual Studio的Build菜單,選擇Configuration Manager彈出Configuration Manager對(duì)話框:

在Active solution configuration框里選擇New,New Solution Configuration 對(duì)話框出現(xiàn)以后,為新build配置輸入新名稱(chēng)MigrateToSQLExpress,然后選擇從Test復(fù)制設(shè)置。選擇Create new project configurations點(diǎn)擊OK。

打開(kāi)Project Properties窗口,選擇Package/Publish Web選項(xiàng)卡,Configuration下拉框里選擇Active (MigrateToSQLExpress),選擇Exclude files from the App_Data folder并確保選中Include all databases configured in Package/Publish SQL tab。
選擇Package/Publish SQL選項(xiàng)卡,設(shè)置build配置為Active(MigrateToSQLExpress),點(diǎn)擊Import from Web.config。
在Database Entries表里,取消選擇SchoolContext-Deployment(因?yàn)椴恍枰渴餝chool數(shù)據(jù)庫(kù))。然后選擇DefaultConnection-Deployment來(lái)配置membership 數(shù)據(jù)庫(kù)的設(shè)置。
在Connection string for destination database里,輸入下面列出的connection string,它指向你剛為開(kāi)發(fā)環(huán)境創(chuàng)建的新SQL Server Express membership數(shù)據(jù)庫(kù)。
Data Source=.\SQLExpress;Initial Catalog=aspnetDev;Integrated Security=True;Pooling=False;
確保選擇了Pull data and/or schema from an existing database項(xiàng),
Connection string for the source database的值來(lái)自Web.config文件,它指向原來(lái)的開(kāi)發(fā)環(huán)境SQL Server Compact membership數(shù)據(jù)庫(kù)。將Database scripting options 的項(xiàng)從Schema Only修改為Schema and Data。

保存Package/Publish SQL里的修改。
部署到測(cè)試環(huán)境
Solution Configurations下拉框里選擇MigrateToSQLExpress build配置, Publish profile下拉框里選擇Test,然后點(diǎn)擊Publish Web。(如果你自定義了你的Visual Studio使這些工具欄的這些設(shè)置不能用的話,請(qǐng)參考第8章的內(nèi)容)

Visual Studio部署了修改后的程序,并在Output窗口顯示了成功信息。
修改Web.config 里的Connection Strings
打開(kāi)Web.config文件,替換下面的代碼到connectionStrings元素節(jié)點(diǎn):
<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運(yùn)行,和測(cè)試、生產(chǎn)環(huán)境一樣,添加一個(gè)student驗(yàn)證數(shù)據(jù)庫(kù)是否能正常工作。
如果按照上面的步驟遷移了用戶(hù)數(shù)據(jù),訪問(wèn)Update Credits頁(yè)面來(lái)驗(yàn)證部署是否正確,如果沒(méi)有的話,創(chuàng)建一個(gè)administrator賬戶(hù)然后訪問(wèn)Update Credits頁(yè)面來(lái)驗(yàn)證。
12. 清除SQL Server Compact文件
現(xiàn)在,不在需要支持SQL Server Compact 的數(shù)據(jù)庫(kù)文件和NuGet包了,如果你原因,可以刪除這些不必要的文件(不強(qiáng)求)。
在Solution Explorer里刪除App_Data目錄下的.sdf文件(amd64和x86子目錄)。
在Solution Explorer里,右鍵ContosoUniversity項(xiàng)目選擇Add Library Package Reference,在Add Library Package Reference對(duì)話框里選擇EntityFramework.SqlServerCompact包并點(diǎn)擊Uninstall。

卸載成功以后,同樣的方式也卸載SqlServerCompact包(必須卸載,因?yàn)?strong>EntityFramework.SqlServerCompact依賴(lài)于它)。
同樣的步驟,刪除ContosoUniversity.DAL項(xiàng)目里的這2個(gè)包。
最后,可以MigrateToSqlExpress Build配置了,因?yàn)樗鼉H僅是為遷移數(shù)據(jù)而準(zhǔn)備的。Build菜單里選擇Configuration Manager,在彈出的Configuration Manager對(duì)話框里,Active solution configuration下拉菜單里選擇Edit,在Edit Solution Configurations對(duì)話框里選擇MigrateToSQLExpress,然后點(diǎn)擊Remove。
現(xiàn)在已經(jīng)成功將數(shù)據(jù)庫(kù)遷移至SQL Server Express和完整版SQL Server,下一章節(jié),將做另外一處數(shù)據(jù)庫(kù)修改,然后在測(cè)試、生產(chǎn)環(huán)境使用SQL Server Express和完整版SQL Server的時(shí)候,如何部署這些修改。
SQL Server Express和完整版SQL Server
一旦你決定使用完整版SQL Server,你需要在開(kāi)發(fā)和測(cè)試環(huán)境使用SQL Server Express 或者完整版SQL Server。在工具支持和數(shù)據(jù)庫(kù)引擎功能上,SQL Server Compact 和其它版本的SQL Server都是有區(qū)別的,可以導(dǎo)致不同的代碼產(chǎn)生不同的結(jié)果。
浙公網(wǎng)安備 33010602011771號(hào)