使用 Visual Studio ASP.NET Web 部署:準備資料庫部署

下載入門專案

本教學課程系列說明如何使用 Visual Studio 2012 或 Visual Studio 2010,將 (發佈) ASP.NET Web 應用程式部署至 Azure App Service Web Apps 或協力廠商裝載提供者。 如需系列的相關資訊,請參閱 系列的第一個教學課程

概觀

本教學課程說明如何讓專案準備好進行資料庫部署。 資料庫結構和某些 (不是應用程式兩個資料庫中資料的所有) 都必須部署,才能測試、預備和生產環境。

一般而言,當您開發應用程式時,會將測試資料輸入您不想部署到即時網站的資料庫中。 不過,您可能也有一些想要部署的生產資料。 在本教學課程中,您將設定 Contoso University 專案並準備 SQL 腳本,以便在部署時包含正確的資料。

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

SQL Server Express LocalDB

範例應用程式會使用 SQL Server Express LocalDB。 SQL Server Express是免費版的 SQL Server。 在開發期間通常會使用它,因為它是以與完整版本的SQL Server相同的資料庫引擎為基礎。 您可以使用SQL Server Express進行測試,並確保應用程式在生產環境中的行為相同,但SQL Server版本之間有一些不同功能的例外狀況。

LocalDB 是SQL Server Express的特殊執行模式,可讓您使用資料庫作為.mdf檔案。 一般而言,LocalDB 資料庫檔案會保留在 Web 專案的 App_Data 資料夾中。 SQL Server Express中的使用者實例功能也可讓您使用.mdf檔案,但使用者實例功能已被取代;因此,建議使用 LocalDB 來處理.mdf檔案。

通常不會SQL Server Express用於生產 Web 應用程式。 特別不建議將 LocalDB 用於生產環境與 Web 應用程式,因為它不是設計來搭配 IIS 使用。

在 Visual Studio 2012 中,LocalDB 預設會隨 Visual Studio 一起安裝。 在 Visual Studio 2010 和舊版中,預設會隨 Visual Studio 安裝沒有 LocalDB) 的SQL Server Express (;這就是為什麼您在本系列的第一個教學課程中將其安裝為其中一個必要條件。

如需有關 SQL Server 版本的詳細資訊,包括 LocalDB,請參閱下列資源使用 SQL Server 資料庫

Entity Framework 和 Universal Providers

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

由於此套裝軟體含在 NuGet 套件中,因此專案已經設定好,因此必要的元件會隨著專案一起部署。 (連結指向這些套件的目前版本,可能比您針對本教學課程下載的入門專案中所安裝的更新版本還要新。)

如果您要部署至協力廠商主機提供者,而不是 Azure,請確定您使用 Entity Framework 5.0 或更新版本。 舊版的Code First 移轉需要完全信任,而且大部分的裝載提供者都會在中型信任中執行您的應用程式。 如需中度信任的詳細資訊,請參閱 部署至 IIS 作為測試環境 教學課程。

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

Contoso University 應用程式資料庫是由 Code First 管理,您將使用 Code First 移轉加以部署。 如需使用 Code First 移轉 的資料庫部署概觀,請參閱本系列的第一個教學課程

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

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

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

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

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 檔案,並移除或批註 add 指定 Code First 初始化運算式類別的專案。 元素 appSettings 現在看起來像這樣:

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

注意

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

注意

如果您使用Visual Studio 2013,請在步驟 2 和 3 之間新增下列步驟: (PMC 中的) 輸入 「update-package entityframework -version 6.1.1」 以取得目前的 EF 版本。 然後 (b) 建置專案以取得建置錯誤的清單,並加以修正。 刪除已不存在之命名空間的 using 語句,按一下滑鼠右鍵並按一下 [解析] 以新增需要它們的 using 語句,並將 System.Data.EntityState 的出現次數變更為 System.Data.Entity.EntityState。

啟用 Code First 移轉

  1. 請確定 ContosoUniversity 專案 (不是 ContosoUniversity.DAL) 設定為啟始專案。 在Solution Explorer中,以滑鼠右鍵按一下 ContosoUniversity 專案,然後選取 [設定為啟始專案]。 Code First 移轉會在啟動專案中尋找資料庫連接字串。

  2. 從 [工具]功能表中,選擇[NuGet 套件管理員套件管理員>主控台]。

    Selecting_Package_Manager_Console

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

    enable-migrations 命令

    (如果您收到錯誤,指出無法辨識 enable-migrations 命令,請輸入 命令 update-package EntityFramework -重新安裝 ,然後再試一次。)

    此命令會在 ContosoUniversity.DAL 專案中建立 Migrations 資料夾,並將它放入該資料夾兩個檔案:可用來設定 Migrations 的 Configuration.cs 檔案,以及第一個建立資料庫之移轉的 InitialCreate.cs 檔案。

    Migrations 資料夾

    您已在套件管理員主控台的預設專案下拉式清單中選取 DAL專案,因為 enable-migrations 命令必須在包含 Code First 內容類別別的專案中執行。 當該類別位於類別庫專案中時,Code First 移轉尋找方案啟動專案中的資料庫連接字串。 在 ContosoUniversity 方案中,Web 專案已設定為啟始專案。 如果您不想在 Visual Studio 中將連接字串指定為啟動專案的專案,您可以在 PowerShell 命令中指定啟動專案。 若要查看命令語法,請輸入 命令 get-help enable-migrations

    命令 enable-migrations 會自動建立第一個移轉,因為資料庫已經存在。 替代方式是讓移轉建立資料庫。 若要這樣做,請先使用伺服器總管或SQL Server物件總管刪除 ContosoUniversity 資料庫,再啟用移轉。 啟用移轉之後,請輸入 「add-migration InitialCreate」 命令以手動方式建立第一個移轉。 然後,您可以輸入 「update-database」 命令來建立資料庫。

設定 Seed 方法

在本教學課程中,您將程式碼新增至 Seed Code First 移轉 Configuration 類別的 方法,以新增固定資料。 Code First 移轉每次移轉之後呼叫 Seed 方法。

Seed由於方法會在每次移轉之後執行,因此第一次移轉之後,資料表中已經有資料。 若要處理這種情況,您將使用 AddOrUpdate 方法來更新已經插入的資料列,或如果它們還不存在,請加以插入。 方法 AddOrUpdate 可能不是您案例的最佳選擇。 如需詳細資訊,請參閱 Julie Lerman 部落格上的 EF 4.3 AddOrUpdate 方法

  1. 開啟 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 },
        new Course { CourseID = 4022, Title = "Microeconomics", Credits = 3, DepartmentID = 4 },
        new Course { CourseID = 4041, Title = "Macroeconomics", Credits = 3, DepartmentID = 4 },
        new Course { CourseID = 1045, Title = "Calculus",       Credits = 4, DepartmentID = 2 },
        new Course { CourseID = 3141, Title = "Trigonometry",   Credits = 4, DepartmentID = 2 },
        new Course { CourseID = 2021, Title = "Composition",    Credits = 3, DepartmentID = 1 },
        new Course { CourseID = 2042, Title = "Literature",     Credits = 4, DepartmentID = 1 }
    };
    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();
    
  2. 的參考 List 在其下方有紅色波浪線,因為您 using 還沒有其命名空間的 語句。 以滑鼠右鍵按一下 的其中一個實例 List ,然後按一下 [ 解析],然後按一下 [使用 System.Collections.Generic]。

    使用 using 語句解析

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

    using System.Collections.Generic;
    
  3. 按 CTRL-SHIFT-B 來建置專案。

專案現在已準備好部署 ContosoUniversity 資料庫。 部署應用程式之後,第一次執行應用程式並流覽至存取資料庫的頁面時,Code First 會建立資料庫並執行此方法 Seed

注意

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

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

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

建立成員資格資料庫部署的腳本

Contoso University 應用程式會使用 ASP.NET 成員資格系統和表單驗證來驗證和授權使用者。 [ 更新點數 ] 頁面只能供處於系統管理員角色的使用者存取。

執行應用程式,然後按一下 [ 課程],然後按一下 [ 更新點數]。

按一下 [更新點數]

[ 登入 ] 頁面隨即出現,因為 [ 更新點數 ] 頁面需要系統管理許可權。

輸入 系統管理員 作為使用者名稱和 devpwd 作為密碼,然後按一下 [ 登入]。

登入頁面

[ 更新點數 ] 頁面隨即出現。

更新點數頁面

使用者和角色資訊位於aspnet-ContosoUniversity資料庫中,該資料庫是由Web.config檔案中的DefaultConnection連接字串所指定。

此資料庫不是由 Entity Framework Code First 管理,因此您無法使用移轉進行部署。 您將使用 dbDacFx 提供者來部署資料庫架構,並將發佈設定檔設定為執行腳本,以將初始資料插入資料庫資料表中。

注意

Visual Studio 2013引進了名為 ASP.NET 身分識別) 的新 ASP.NET 成員資格系統 (。 新的系統可讓您將應用程式和成員資格資料表保留在相同的資料庫中,而且您可以使用Code First 移轉來部署兩者。 範例應用程式會使用先前 ASP.NET 成員資格系統,而無法使用 Code First 移轉 部署。 部署此成員資格資料庫的程式也適用于您的應用程式需要部署未由 Entity Framework Code First 建立之SQL Server資料庫的任何其他案例。

在這裡,您通常不希望在生產環境中擁有的相同資料。 當您第一次部署網站時,通常會排除您為測試建立的大部分或所有使用者帳戶。 因此,下載的專案有兩個成員資格資料庫: aspnet-ContosoUniversity.mdf 搭配開發使用者,以及 aspnet-ContosoUniversity-Prod.mdf 與生產使用者。 在本教學課程中,使用者名稱在兩個資料庫中都相同: adminnonadmin。 這兩個使用者都有開發資料庫中的密碼 devpwd ,而生產資料庫中的 prodpwd

您將開發使用者部署到測試環境,並將生產使用者部署到預備和生產環境。 若要這樣做,您將在本教學課程中建立兩個 SQL 腳本,一個用於開發和一個用於生產環境,然後在稍後的教學課程中,您將設定發佈程式來執行它們。

注意

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

您可以使用SQL Server Management Studio (SSMS) 或使用協力廠商工具來手動建立資料部署腳本。 本教學課程的其餘部分將示範如何在 SSMS 中執行,但如果您不想安裝和使用 SSMS,您可以從已完成的專案版本取得腳本,並跳至儲存在方案資料夾中的 區段。

若要安裝 SSMS,請從下載中心安裝:Microsoft SQL Server 2012 Express,方法是按一下[ENU\x64\SQLManagementStudio_x64_ENU.exe] 或[ENU\x86\SQLManagementStudio_x86_ENU.exe]。 如果您為系統選擇錯誤的系統,它將無法安裝,而且您可以嘗試另一個。

(請注意,這是 600 MB 的下載。安裝可能需要很長的時間,而且需要重新開機電腦。)

在SQL Server安裝中心的第一頁上,按一下 [新增] SQL Server獨立安裝,或將功能新增至現有的安裝,並遵循指示,接受預設選項。

建立開發資料庫腳本

  1. 執行 SSMS。

  2. 在 [ 連接到伺服器 ] 對話方塊中,輸入 (localdb) \v11.0 作為 [伺服器名稱],將 [驗證 ] 保留為 [Windows 驗證],然後按一下 [ 連線]。

    SSMS 連線到伺服器

  3. 在 [ 物件總管 ] 視窗中,展開 [ 資料庫],以滑鼠右鍵按一下 aspnet-ContosoUniversity,按一下 [ 工作],然後按一下 [ 產生腳本]。

    SSMS 產生腳本

  4. 在 [ 產生和發佈腳本] 對話方塊中,按一下 [ 設定腳本選項]。

    您可以略過 Choose Objects 步驟,因為預設值是 腳本整個資料庫和所有資料庫物件 ,也就是您想要的專案。

  5. 按一下 [進階]

    SSMS 腳本選項

  6. 在 [ 進階腳本選項] 對話方塊中,向下捲動至 [ 要編寫腳本的資料類型],然後按一下下拉式清單中的 [僅限資料 ] 選項。

  7. 腳本 USE DATABASE 變更為 False。 USE 語句對 Azure SQL Database無效,而且不需要部署至測試環境中的SQL Server Express。

    僅限 SSMS 腳本資料,無 USE 語句

  8. 按一下 [確定]。

  9. 在 [ 產生和發佈腳本 ] 對話方塊中,[ 檔案名 ] 方塊會指定要建立腳本的位置。 將解決方案資料夾的路徑變更 (具有 ContosoUniversity.sln 檔案的資料夾) ,並將檔案名變更為 aspnet-data-dev.sql

  10. 按一下 [下一步 ] 以移至 [ 摘要] 索引卷 標,然後按 [ 下一步] 以建立腳本。

    已建立 SSMS 腳本

  11. 按一下 [完成] 。

建立生產資料庫腳本

由於您尚未使用生產資料庫執行專案,因此尚未附加至 LocalDB 實例。 因此,您必須先附加資料庫。

  1. 在 SSMS 物件總管中,以滑鼠右鍵按一下 [資料庫 ],然後按一下 [ 附加]。

    SSMS 附加

  2. 在 [附加資料庫] 對話方塊中,按一下 [新增],然後流覽至App_Data資料夾中的aspnet-ContosoUniversity-Prod.mdf檔案。

    SSMS 新增 .mdf 檔案以附加

  3. 按一下 [確定]。

  4. 遵循您稍早用來建立生產檔案腳本的相同程式。 將腳本檔案命名為 aspnet-data-prod.sql

摘要

這兩個資料庫現在都已準備好部署,而且您在方案資料夾中有兩個數據部署腳本。

資料部署腳本

在下列教學課程中,您會設定會影響部署的專案設定,並針對部署應用程式中必須不同之設定設定設定,設定自動 Web.config 檔案轉換。

相關資訊

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