使用 Visual Studio 或 Visual Web 開發人員部署具有SQL Server Compact的 ASP.NET Web 應用程式:部署 SQL Server Compact 資料庫 - 2/12

作者 :Tom Dykstra

下載入門專案

本系列教學課程示範如何使用 Visual Studio 2012 RC 或 Visual Studio Express 2012 RC for Web,部署 (發佈) 包含 SQL Server Compact 資料庫的 ASP.NET Web 應用程式專案。 如果您安裝 Web 發佈更新,也可以使用 Visual Studio 2010。 如需系列簡介,請參閱 系列中的第一個教學課程。

如需示範 Visual Studio 2012 RC 版本之後引進的部署功能的教學課程,示範如何部署 SQL Server Compact 以外的SQL Server版本,並示範如何部署至 Azure App Service Web Apps,請參閱使用 Visual Studio ASP.NET Web 部署

概觀

本教學課程說明如何設定兩個SQL Server Compact資料庫和資料庫引擎以進行部署。

針對資料庫存取,Contoso University 應用程式需要下列必須與應用程式一起部署的軟體,因為它不包含在.NET Framework中:

也必須部署應用程式兩個資料庫中的資料) 資料庫結構和部分 (。 一般而言,當您開發應用程式時,您會將測試資料輸入您不想部署到即時網站的資料庫中。 不過,您也可以輸入一些您想要部署的生產資料。 在本教學課程中,您將設定 Contoso University 專案,以便在部署時包含必要的軟體和正確的資料。

提醒:如果您在進行教學課程時收到錯誤訊息或某些內容無法運作,請務必檢查 疑難排解頁面

SQL Server Compact與SQL Server Express

範例應用程式使用 SQL Server Compact 4.0。 此資料庫引擎是網站相對新的選項;舊版SQL Server Compact無法在 Web 主控環境中運作。 相較于使用SQL Server Express開發並部署至完整SQL Server的常見案例,SQL Server Compact提供一些優點。 視您選擇的主機提供者而定,SQL Server Compact部署可能比較便宜,因為有些提供者會收取額外的費用,以支援完整的SQL Server資料庫。 SQL Server Compact不需要額外費用,因為您可以將資料庫引擎本身部署為 Web 應用程式的一部分。

不過,您也應該注意其限制。 SQL Server Compact不支援預存程式、觸發程式、檢視或複寫。 (如需SQL Server Compact不支援之SQL Server功能的完整清單,請參閱SQL Server Compact與SQL Server之間的差異。) 此外,您可以使用某些工具來操作架構和資料SQL Server Express和SQL Server資料庫不適用於SQL Server Compact。 例如,您無法在 Visual Studio 中使用 SQL Server Management Studio 或 SQL Server Data Tools 搭配 SQL Server Compact 資料庫。 您有其他選項可用來處理SQL Server Compact資料庫:

  • 您可以在 Visual Studio 中使用伺服器總管,以提供有限的資料庫操作功能給SQL Server Compact。
  • 您可以使用 WebMatrix的資料庫操作功能,其功能比伺服器總管還多。
  • 您可以使用功能相對完整的協力廠商或開放原始碼工具,例如SQL Server Compact工具箱SQL Compact 資料和架構腳本公用程式
  • 您可以撰寫並執行自己的 DDL (資料定義語言) 腳本,以運算元據庫架構。

您可以從SQL Server Compact開始,然後在需求演進後升級。 本系列稍後的教學課程說明如何從SQL Server Compact移轉至SQL Server Express和SQL Server。 不過,如果您要建立新的應用程式,而且預期未來需要SQL Server,最好從SQL Server或SQL Server Express開始。

設定用於部署的 SQL Server Compact Database Engine

安裝下列 NuGet 套件,即可新增 Contoso University 應用程式中資料存取所需的軟體:

連結會指向這些套件的目前版本,可能比您在本教學課程下載的入門專案中安裝的套件還新。 若要部署至裝載提供者,請確定您使用 Entity Framework 5.0 或更新版本。 舊版Code First 移轉需要「完全信任」,而且您的應用程式會在「中度信任」中執行許多裝載提供者。 如需中度信任的詳細資訊,請參閱 部署至 IIS 作為測試環境 教學課程。

NuGet 套件安裝通常會負責使用應用程式部署此軟體所需的所有專案。 在某些情況下,這牽涉到變更Web.config檔案,以及新增每當建置解決方案時執行的 PowerShell 腳本等工作。 如果您想要新增任何 (這些功能的支援,例如SQL Server Compact和 Entity Framework) 而不使用 NuGet,請確定您知道 NuGet 套件安裝的功能,以便手動執行相同的工作。

有一個例外狀況,NuGet 不會處理您必須執行的所有工作,以確保部署成功。 SqlServerCompact NuGet 套件會將建置後腳本新增至專案,將原生元件複製到專案bin資料夾下的x86amd64子資料夾,但腳本不包含專案中的資料夾。 因此,除非您手動將其包含在專案中,否則 Web Deploy 不會將它們複製到目的地網站。 (此行為會產生預設部署組態;您不會在這些教學課程中使用的另一個選項是變更控制此行為的設定。您可以變更的設定是 [專案] 底下執行應用程式所需的檔案才能在[專案屬性] 視窗的 [封裝/發佈 Web] 索引標籤上部署。通常不建議變更此設定,因為它可能會導致將更多檔案部署至生產環境,而不是在該環境中所需的檔案。如需替代專案的詳細資訊,請參閱設定專案屬性教學課程。)

建置專案,然後在Solution Explorer如果您尚未這麼做,請按一下 [顯示所有檔案]。 您可能也必須按一下 [ 重新整理]。

Solution_Explorer_Show_All_Files

展開 bin 資料夾以查看 amd64x86 資料夾,然後選取這些資料夾,按一下滑鼠右鍵,然後選取 [ 包含在專案中]。

amd64_and_x86_in_Solution_Explorer.png

資料夾圖示會變更,以顯示資料夾已包含在專案中。

Solution_Explorer_amd64_included.png

設定應用程式資料庫部署的Code First 移轉

當您部署應用程式資料庫時,通常您不只會將開發資料庫中的所有資料部署到生產環境,因為其中的大部分資料可能僅供測試之用。 例如,測試資料庫中的學生名稱是虛構的。 另一方面,您通常無法只部署資料庫結構,完全沒有資料。 測試資料庫中的某些資料可能是實際資料,而且使用者開始使用應用程式時必須有此資料。 例如,您的資料庫可能有包含有效成績值或實際部門名稱的資料表。

若要模擬此常見案例,您將設定Code First 移轉 Seed 方法,只插入資料庫中您想要在生產環境中的資料。 此 Seed 方法不會插入測試資料,因為它會在 Code First 在生產環境中建立資料庫之後于生產環境中執行。

在移轉發行之前的舊版 Code First 中,種子方法也通常會插入測試資料,因為開發期間每個模型變更都必須從頭完全刪除並重新建立。 使用Code First 移轉時,測試資料會在資料庫變更之後保留,因此不需要在 Seed 方法中包含測試資料。 您下載的專案會使用移轉前方法,在初始化運算式類別的 Seed 方法中包含所有資料。 在本教學課程中,您將停用初始化運算式類別並啟用移轉。 然後,您將更新 Migrations 組態類別中的 Seed 方法,讓它只插入您想要插入生產環境的資料。

下圖說明應用程式資料庫的架構:

School_database_diagram

針對這些教學課程,您將假設 第一次部署月臺時, StudentEnrollment 資料表應該是空的。 其他資料表包含必須在應用程式上線時預先載入的資料。

由於您將使用 Code First 移轉,因此不再需要使用DropCreateDatabaseIfModelChanges Code First 初始化運算式。 這個初始化運算式的程式碼位於 ContosoUniversity.DAL 專案的 SchoolInitializer.cs 檔案中。 每當應用程式第一次嘗試存取資料庫時,Web.config 檔案的 appSettings 元素中的設定會導致此初始化運算式執行:

<appSettings>
  <add key="Environment" value="Dev" />
  <add key="DatabaseInitializerForType ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL" value="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity.DAL" />
</appSettings>

開啟應用程式Web.config檔案,並從 appSettings 元素移除指定 Code First 初始化運算式類別的 元素。 appSettings 元素現在看起來像這樣:

<appSettings>
  <add key="Environment" value="Dev" />
</appSettings>

注意

另一個指定初始化運算式類別的方式是在Global.asax檔案的 方法中 Application_Start 呼叫 Database.SetInitializer 來執行。 如果您要在使用該方法指定初始化運算式的專案中啟用移轉,請移除該行程式碼。

接下來,啟用Code First 移轉。

第一個步驟是確定 ContosoUniversity 專案已設定為啟始專案。 在Solution Explorer中,以滑鼠右鍵按一下 ContosoUniversity 專案,然後選取[設定為啟始專案]。 Code First 移轉會在啟動專案中尋找資料庫連接字串。

從 [ 工具] 功能表中,按一下 [NuGet 套件管理員 ],然後按一下 [ 套件管理員主控台]。

Selecting_Package_Manager_Console

[套件管理員主控台 ] 視窗頂端,選取 [ContosoUniversity.DAL] 作為預設專案,然後在 PM> 提示字元中輸入 「enable-migrations」。

enable-migrations_command

此命令會在 ContosoUniversity.DAL 專案的新Migrations資料夾中建立Configuration.cs檔案。

Migrations_folder_in_Solution_Explorer

您已選取 DAL 專案,因為 「enable-migrations」 命令必須在包含 Code First 內容類別別的專案中執行。 當該類別位於類別庫專案中時,Code First 移轉尋找方案之啟始專案中的資料庫連接字串。 在 ContosoUniversity 方案中,Web 專案已設定為啟始專案。 (如果您不想將連接字串的專案指定為 Visual Studio 中的啟動專案,您可以在 PowerShell 命令中指定啟動專案。若要查看 enable-migrations 命令的命令語法,您可以輸入命令 「get-help enable-migrations」.)

開啟 Configuration.cs 檔案,並以下列程式碼取代 方法中的 Seed 批註:

var instructors = new List<Instructor>
{   
    new Instructor { FirstMidName = "Kim",     LastName = "Abercrombie", HireDate = DateTime.Parse("1995-03-11"), OfficeAssignment = new OfficeAssignment { Location = "Smith 17" } },
    new Instructor { FirstMidName = "Fadi",    LastName = "Fakhouri",    HireDate = DateTime.Parse("2002-07-06"), OfficeAssignment = new OfficeAssignment { Location = "Gowan 27" } },
    new Instructor { FirstMidName = "Roger",   LastName = "Harui",       HireDate = DateTime.Parse("1998-07-01"), OfficeAssignment = new OfficeAssignment { Location = "Thompson 304" } },
    new Instructor { FirstMidName = "Candace", LastName = "Kapoor",      HireDate = DateTime.Parse("2001-01-15") },
    new Instructor { FirstMidName = "Roger",   LastName = "Zheng",       HireDate = DateTime.Parse("2004-02-12") }
};
instructors.ForEach(s => context.Instructors.AddOrUpdate(i => i.LastName, s));
context.SaveChanges();

var departments = new List<Department>
{
    new Department { Name = "English",     Budget = 350000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 1 },
    new Department { Name = "Mathematics", Budget = 100000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 2 },
    new Department { Name = "Engineering", Budget = 350000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 3 },
    new Department { Name = "Economics",   Budget = 100000, StartDate = DateTime.Parse("2007-09-01"), PersonID = 4 }
};
departments.ForEach(s => context.Departments.AddOrUpdate(d => d.Name, s));
context.SaveChanges();

var courses = new List<Course>
{
    new Course { CourseID = 1050, Title = "Chemistry",      Credits = 3, DepartmentID = 3, Instructors = new List<Instructor>() },
    new Course { CourseID = 4022, Title = "Microeconomics", Credits = 3, DepartmentID = 4, Instructors = new List<Instructor>() },
    new Course { CourseID = 4041, Title = "Macroeconomics", Credits = 3, DepartmentID = 4, Instructors = new List<Instructor>() },
    new Course { CourseID = 1045, Title = "Calculus",       Credits = 4, DepartmentID = 2, Instructors = new List<Instructor>() },
    new Course { CourseID = 3141, Title = "Trigonometry",   Credits = 4, DepartmentID = 2, Instructors = new List<Instructor>() },
    new Course { CourseID = 2021, Title = "Composition",    Credits = 3, DepartmentID = 1, Instructors = new List<Instructor>() },
    new Course { CourseID = 2042, Title = "Literature",     Credits = 4, DepartmentID = 1, Instructors = new List<Instructor>() }
};
courses.ForEach(s => context.Courses.AddOrUpdate(s));
context.SaveChanges();

courses[0].Instructors.Add(instructors[0]);
courses[0].Instructors.Add(instructors[1]);
courses[1].Instructors.Add(instructors[2]);
courses[2].Instructors.Add(instructors[2]);
courses[3].Instructors.Add(instructors[3]);
courses[4].Instructors.Add(instructors[3]);
courses[5].Instructors.Add(instructors[3]);
courses[6].Instructors.Add(instructors[3]);
context.SaveChanges();

的參考 List 在其下方有紅色波浪線,因為您 using 還沒有其命名空間的 語句。 以滑鼠右鍵按一下 的其中一個實例 List ,然後按一下 [ 解析],然後按一下 [使用 System.Collections.Generic]。

使用 using 語句解析

此功能表選取專案會將下列程式碼新增至 using 接近檔案頂端的 語句。

using System.Collections.Generic;

注意

將程式碼新增至 Seed 方法,是您可以將固定資料插入資料庫的許多方式之一。 替代方式是將程式碼新增至 Up 每個移轉類別的 和 Down 方法。 UpDown 方法包含實作資料庫變更的程式碼。 您會在 部署資料庫更新 教學課程中看到這些範例。

您也可以使用 方法來撰寫執行 SQL 語句的程式 Sql 代碼。 例如,如果您要將 [預算] 資料行新增至 Department 資料表,而且想要將所有部門預算初始化為 $1,000.00 作為移轉的一部分,您可以將下列程式程式碼新增至 Up 該移轉的方法:

Sql("UPDATE Department SET Budget = 1000");

本教學課程所示的這個範例會在 AddOrUpdate Code First 移轉 Configuration 類別的 方法中使用 Seed 方法。 Code First 移轉每次移轉之後呼叫 Seed 方法,而且這個方法會更新已插入的資料列,或如果它們還不存在,則會加以插入。 方法 AddOrUpdate 可能不是您案例的最佳選擇。 如需詳細資訊,請參閱 Julie Lerman 部落格上的 EF 4.3 AddOrUpdate 方法

按 CTRL-SHIFT-B 來建置專案。

下一 DbMigration 個步驟是建立初始移轉的類別。 您想要此移轉建立新的資料庫,因此您必須刪除已經存在的資料庫。 SQL Server Compact資料庫包含在App_Data資料夾中的.sdf檔案中。 在Solution Explorer中,展開 ContosoUniversity 專案中的App_Data,以查看兩個以.sdf檔案表示的SQL Server Compact資料庫。

以滑鼠右鍵按一下 School.sdf 檔案,然後按一下 [ 刪除]。

sdf_files_in_Solution_Explorer

在 [ 套件管理員主控台] 視窗中,輸入 「add-migration Initial」 命令來建立初始移轉,並將它命名為 「Initial」。

add-migration_command

Code First 移轉會在Migrations資料夾中建立另一個類別檔案,而這個類別包含建立資料庫架構的程式碼。

套件管理員主控台中,輸入 「update-database」 命令以建立資料庫並執行 Seed 方法。

update-database_command

(如果您收到指出資料表已存在且無法建立的錯誤,可能是因為您在刪除資料庫之後執行應用程式,而且在執行 之前執行 update-database 。在此情況下,請再次刪除 School.sdf 檔案,然後重試 update-database command.)

執行應用程式。 現在 Students 頁面是空的,但 Instructors 頁面包含講師。 這是您在部署應用程式之後在生產環境中取得的內容。

Empty_Students_page

Instructors_page_after_initial_migration

專案現在已準備好部署 School 資料庫。

建立用於部署的成員資格資料庫

Contoso University 應用程式會使用 ASP.NET 成員資格系統和表單驗證來驗證和授權使用者。 只有系統管理員才能存取其中一個頁面。 若要查看此頁面,請執行應用程式,然後從 [課程] 下的飛出視窗功能表選取 [更新點數]。 應用程式會顯示 [ 登入 ] 頁面,因為只有系統管理員有權使用 [更新點數 ] 頁面。

Log_in_page

使用密碼 「Pas$w0rd」 以 「admin」 身分登入, (請注意數位零取代 「w0rd」) 中的字母 「o」。 登入之後,會顯示 [ 更新點數 ] 頁面。

Update_Credits_page

當您第一次部署網站時,通常會排除您為測試建立的大部分或所有使用者帳戶。 在此情況下,您將部署系統管理員帳戶,且沒有使用者帳戶。 您不會手動刪除測試帳戶,而是建立新的成員資格資料庫,該資料庫只有您在生產環境中所需的一個系統管理員使用者帳戶。

注意

成員資格資料庫會儲存帳戶密碼的雜湊。 若要將帳戶從一部電腦部署到另一部電腦,您必須確定雜湊常式不會在目的地伺服器上產生不同于來源電腦上的雜湊。 只要您未變更預設演算法,它們會在您使用 ASP.NET Universal Providers時產生相同的雜湊。 預設演算法是 HMACSHA256,而且是在 Web.config 檔案中machineKey元素的驗證屬性中指定。

成員資格資料庫不會由Code First 移轉維護,而且沒有自動初始化運算式會將資料庫植入測試帳戶 (,因為學校資料庫) 。 因此,若要讓測試資料保持可用,請先建立測試資料庫的複本,再建立新的資料庫。

Solution Explorer中,將App_Data資料夾中的aspnet.sdf檔案重新命名為aspnet-Dev.sdf。 (不要建立複本,只要重新命名它,您就會在一段時間建立新的資料庫。)

Solution Explorer中,確定已選取 ContosoUniversity (Web 專案,而不是選取 ContosoUniversity.DAL) 。 然後在 [ 專案] 功能表中,選取 [ASP.NET 組態 ] 以執行 [網站管理工具 ] () 。

選取 [安全性] 索引標籤。

WAT_Security_tab

按一下 [建立或管理角色 ],然後新增 系統管理員 角色。

WAT_Create_New_Role

流覽回 [ 安全性 ] 索引標籤,按一下 [ 建立使用者],並以系統管理員身分新增使用者 「admin」。 在按一下 [ 建立使用者] 頁面上的 [ 建立使用者 ] 按鈕之前,請確定您選取 [ 系統管理員 ] 核取方塊。 本教學課程中使用的密碼是 「Pas$w0rd」,您可以輸入任何電子郵件地址。

WAT_Create_User

關閉瀏覽器。 在Solution Explorer中,按一下 [重新整理] 按鈕以查看新的aspnet.sdf檔案。

New_aspnet.sdf_in_Solution_Explorer

以滑鼠右鍵按一下 aspnet.sdf ,然後選取 [ 包含在專案中]。

區分開發與生產資料庫

在本節中,您將重新命名資料庫,讓開發版本是 School-Dev.sdf 和 aspnet-Dev.sdf,而生產版本是 School-Prod.sdf 和 aspnet-Prod.sdf。 這並非必要,但這麼做可協助您避免混淆資料庫的測試和生產版本。

Solution Explorer中,按一下 [重新整理] 並展開 [App_Data] 資料夾,以查看您稍早建立的 School 資料庫;以滑鼠右鍵按一下它,然後選取 [包含在專案中]。

Including_School.sdf_in_project

aspnet.sdf 重新命名為 aspnet-Prod.sdf

School.sdf 重新命名為 School-Dev.sdf

當您在 Visual Studio 中執行應用程式時,您不想使用資料庫檔案的 -Prod 版本,您想要使用 -Dev 版本。 因此,您必須變更Web.config檔案中的連接字串,使其指向 資料庫的 -Dev 版本。 (您尚未建立 School-Prod.sdf 檔案,但這沒問題,因為 Code First 會在您第一次在該處執行應用程式時,在生產環境中建立該資料庫。)

開啟應用程式Web.config檔案,並找出連接字串:

<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>

SQL Server Compact資料庫引擎和這兩個資料庫現在都已準備好進行部署。 在下列教學課程中,您會針對開發、測試和生產環境中必須不同的設定,設定自動 Web.config 檔案轉換。 (必須變更的設定包括連接字串,但稍後當您建立發行設定檔時,將會設定這些變更。)

相關資訊

如需 NuGet 的詳細資訊,請參閱使用 NuGet 和 NuGet 檔管理專案庫 如果您不想使用 NuGet,您將需要瞭解如何分析 NuGet 套件,以判斷安裝 NuGet 套件時會執行什麼作業。 (例如,它可能會設定Web.config轉換、設定 PowerShell 腳本在建置階段執行等) 若要深入瞭解 NuGet 的運作方式,請參閱特別是建立和發佈套件和組態檔和原始程式碼轉換