共用方式為


使用 Visual Studio ASP.NET Web 部署:部署資料庫更新

作者 :Tom Dykstra

下載入門專案

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

概觀

在本教學課程中,您會進行資料庫變更和相關程式碼變更、測試 Visual Studio 中的變更,然後將更新部署至測試、預備和生產環境。

本教學課程會先示範如何更新由 Code First 移轉 管理的資料庫,稍後再示範如何使用 dbDacFx 提供者更新資料庫。

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

使用 Code First 移轉 部署資料庫更新

在本節中,您會將生日資料行新增至 PersonInstructor 實體的 Student 基類。 然後,您會更新顯示講師資料的頁面,使其顯示新的資料行。 最後,您要部署變更以測試、預備和生產環境。

將資料行新增至應用程式資料庫中的資料表

  1. ContosoUniversity.DAL 專案中,開啟 Person.cs ,並在類別結尾 Person 新增下列屬性, (它之後應該有兩個右大括弧) :

    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
    [Display(Name = "Birth Date")]
    public DateTime? BirthDate { get; set; }
    

    接下來,更新 Seed 方法,使其提供新資料行的值。 開啟 Migrations\Configuration.cs ,並取代以下列程式碼區塊開頭 var instructors = new List<Instructor> 的程式碼區塊,其中包含生日資訊:

    var instructors = new List<Instructor>
    {
        new Instructor { FirstMidName = "Kim",     LastName = "Abercrombie", HireDate = DateTime.Parse("1995-03-11"), BirthDate = DateTime.Parse("1918-08-12"), OfficeAssignment = new OfficeAssignment { Location = "Smith 17" } },
        new Instructor { FirstMidName = "Fadi",    LastName = "Fakhouri",    HireDate = DateTime.Parse("2002-07-06"), BirthDate = DateTime.Parse("1960-03-15"), OfficeAssignment = new OfficeAssignment { Location = "Gowan 27" } },
        new Instructor { FirstMidName = "Roger",   LastName = "Harui",       HireDate = DateTime.Parse("1998-07-01"), BirthDate = DateTime.Parse("1970-01-11"), OfficeAssignment = new OfficeAssignment { Location = "Thompson 304" } },
        new Instructor { FirstMidName = "Candace", LastName = "Kapoor",      HireDate = DateTime.Parse("2001-01-15"), BirthDate = DateTime.Parse("1975-04-11") },
        new Instructor { FirstMidName = "Roger",   LastName = "Zheng",       HireDate = DateTime.Parse("2004-02-12"), BirthDate = DateTime.Parse("1957-10-12") }
    };
    
  2. 建置方案,然後開啟 [套件管理員主控台 ] 視窗。 請確定 ContosoUniversity.DAL 仍選取為 [預設] 專案

  3. 在 [ 套件管理員主控台] 視窗中,選取 [ContosoUniversity.DAL ] 作為 [預設] 專案,然後輸入下列命令:

    add-migration AddBirthDate
    

    當此命令完成時,Visual Studio 會開啟定義新 DbMigration 類別的類別檔案,並在 方法中 Up 查看建立新資料行的程式碼。 方法 Up 會在您實作變更時建立資料行,而且 Down 當您復原變更時,方法會刪除該資料行。

    AddBirthDate_migration_code

  4. 建置方案,然後在 [ 套件管理員主控台 ] 視窗中輸入下列命令, (確定仍選取 ContosoUniversity.DAL 專案) :

    update-database
    

    Entity Framework 會 Up 執行 方法,然後執行 Seed 方法。

在 Instructors 頁面中顯示新資料行

  1. 在 ContosoUniversity 專案中,開啟 Instructors.aspx 並新增範本欄位以顯示生日。 在雇用日期與辦公室工作分派之間新增它:

    <asp:TemplateField HeaderText="Hire Date" SortExpression="HireDate">
        <ItemTemplate>
            <asp:Label ID="InstructorHireDateLabel" runat="server" Text='<%# Eval("HireDate", "{0:d}") %>'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox ID="InstructorHireDateTextBox" runat="server" Text='<%# Bind("HireDate", "{0:d}") %>' Width="7em"></asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Birth Date" SortExpression="BirthDate">
        <ItemTemplate>
            <asp:Label ID="InstructorBirthDateLabel" runat="server" Text='<%# Eval("BirthDate", "{0:d}") %>'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox ID="InstructorBirthDateTextBox" runat="server" Text='<%# Bind("BirthDate", "{0:d}") %>'
                Width="7em"></asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Office Assignment" SortExpression="OfficeAssignment.Location">
        <ItemTemplate>
            <asp:Label ID="InstructorOfficeLabel" runat="server" Text='<%# Eval("OfficeAssignment.Location") %>'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox ID="InstructorOfficeTextBox" runat="server"
                Text='<%# Eval("OfficeAssignment.Location") %>' Width="7em"
                OnInit="InstructorOfficeTextBox_Init"></asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>
    

    (如果程式碼縮排不同步,您可以按 CTRL-K,然後按 CTRL-D 自動重新格式化 file.)

  2. 執行應用程式,然後按一下 Instructors 連結。

    當頁面載入時,您會看到其具有新的生日欄位。

    [講師] 頁面的螢幕擷取畫面,其中顯示其名稱、雇用日期、生日和 Office 工作分派。

  3. 關閉瀏覽器。

部署資料庫更新

  1. 方案總管選取 ContosoUniversity 專案。

  2. [Web One Click Publish ] 工具列中,按一下 [測試 發行設定檔],然後按一下 [ 發佈 Web]。 (如果工具列已停用,請選取方案總管.) 中的 ContosoUniversity 專案

    Visual Studio 會部署更新的應用程式,而瀏覽器會開啟至首頁。

  3. 執行 Instructors 頁面,以確認更新已成功部署。

    當應用程式嘗試存取此頁面的資料庫時,Code First 會更新資料庫架構並執行 Seed 方法。 當頁面顯示時,您會看到預期的 [生日] 資料 行,其中包含日期。

  4. [Web One Click Publish ] 工具列中,按一下 [預備 發行設定檔],然後按一下 [ 發佈 Web]。

  5. 在預備環境中執行 Instructors 頁面,以確認已成功部署更新。

  6. [Web One Click Publish ] 工具列中,按一下 [生產 發佈設定檔],然後按一下 [ 發佈 Web]。

  7. 在生產環境中執行 Instructors 頁面,以確認更新已成功部署。

    對於包含資料庫變更的實際生產應用程式更新,您通常也會使用 app_offline.htm,在部署期間讓應用程式離線,如上一個教學課程中所見。

使用 dbDacFx 提供者部署資料庫更新

在本節中,您會將 [批註 ] 資料行新增至成員資格資料庫中的 [使用者 ] 資料表,並建立頁面,讓您顯示和編輯每個使用者的批註。 接著,您要部署變更以測試、預備和生產環境。

將資料行加入成員資格資料庫中的資料表

  1. 在 Visual Studio 中,開啟SQL Server 物件總管

  2. 展開 [ (localdb) \v11.0]、展開 [ 資料庫]、展開 aspnet-ContosoUniversity (不是 aspnet-ContosoUniversity-Prod) ,然後展開 [ 資料表]。

    如果您在 SQL Server節點底下看不到 (localdb) \v11.0,請以滑鼠右鍵按一下SQL Server節點,然後按一下 [新增SQL Server]。 在 [ 連線到伺服器 ] 對話方塊中,輸入 (localdb) \v11.0 作為 [伺服器名稱],然後按一下 [ 連線]。

    如果您沒有看到aspnet-ContosoUniversity,請執行專案並使用系統管理員認證登入, (密碼為devpwd) ,然後重新整理SQL Server 物件總管視窗。

  3. 以滑鼠右鍵按一下[使用者] 資料表,然後按一下[檢視Designer]。

    SSOX 檢視Designer

  4. 在設計工具中,新增 [批註 ] 資料行,並將 它設為 Nvarchar (128) 和可為 Null,然後按一下 [ 更新]。

    新增批註資料行

  5. 在 [預覽資料庫更新] 方塊中,按一下 [更新資料庫]。

    預覽資料庫更新

建立頁面以顯示和編輯新資料行

  1. 方案總管中,以滑鼠右鍵按一下 ContosoUniversity 專案中的 [帳戶] 資料夾,按一下 [新增],然後按一下 [新增專案]。

  2. 使用主版頁面建立新的 Web 表單,並將它命名為UserInfo.aspx。 接受預設 Site.Master 檔案作為主版頁面。

  3. 將下列標記複製到 MainContentContent 元素中, (3 Content 個專案的最後一個) :

    <h2>User Information</h2>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DefaultConnection %>" 
            SelectCommand="SELECT UserId, UserName, Comments FROM [Users]" 
            UpdateCommand="UPDATE [Users] SET [UserName] = @UserName, [Comments] = @Comments WHERE [UserId] = @UserId">
            <DeleteParameters>
                <asp:Parameter Name="UserId" Type="Object" />
            </DeleteParameters>
            <UpdateParameters>
                <asp:Parameter Name="UserId" Type="Object" />
                <asp:Parameter Name="UserName" Type="String" />
                <asp:Parameter Name="Comments" Type="String" />
            </UpdateParameters>
        </asp:SqlDataSource>
    
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="UserId" DataSourceID="SqlDataSource1">
            <Columns>
                <asp:CommandField ShowEditButton="True" />
                <asp:BoundField DataField="UserName" HeaderText="UserName" SortExpression="UserName" />
                <asp:BoundField DataField="Comments" HeaderText="Comments" SortExpression="Comments" />
            </Columns>
        </asp:GridView>
    
  4. 以滑鼠右鍵按一下 [UserInfo.aspx ] 頁面,然後按一下 [在瀏覽器中檢視]。

  5. 使用 系統管理員 使用者認證登入 (密碼是 devpwd) ,並將一些批註新增至使用者,以確認頁面正常運作。

    顯示 UserInfo 頁面的螢幕擷取畫面,其中顯示 UserName 測試和批註 Tom 的測試帳戶。

  6. 關閉瀏覽器。

部署資料庫更新

若要使用 dbDacFx 提供者進行部署,您只需在發行設定檔中選取 [更新資料庫 ] 選項即可。 不過,當您使用此選項時,針對初始部署,也設定了一些額外的 SQL 腳本來執行:這些腳本仍在設定檔中,您必須防止它們再次執行。

  1. 以滑鼠右鍵按一下 ContosoUniversity 專案,然後按一下 [發佈],以開啟[發佈 Web精靈]。

  2. 選取 [測試 設定檔]。

  3. 按一下 [設定] 索引標籤。

  4. [DefaultConnection] 底下,選取 [更新資料庫]。

  5. 停用您設定為針對初始部署執行的其他腳本:

    1. 按一下 [ 設定資料庫更新]。
    2. 在 [設定資料庫更新] 對話方塊中,清除Grant.sqlaspnet-data-dev.sql旁的核取方塊。
    3. 按一下 [關閉] 。
  6. 按一下 [預覽] 索引標籤。

  7. [資料庫][DefaultConnection] 右邊,按一下 [預覽資料庫 ] 連結。

    資料庫預覽

    預覽視窗會顯示將在目的地資料庫中執行的腳本,讓該資料庫架構符合源資料庫的架構。 腳本包含可加入新資料行的 ALTER TABLE 命令。

  8. 關閉 [ 資料庫預覽 ] 對話方塊,然後按一下 [ 發佈]。

    Visual Studio 會部署更新的應用程式,而瀏覽器會開啟至首頁。

  9. 執行 UserInfo 頁面 (將 Account/UserInfo.aspx 新增至首頁 URL) ,以確認更新已成功部署。 您必須輸入 admindevpwd來登入。

    資料表中的資料預設不會部署,而且您未設定要執行的資料部署腳本,因此找不到您在開發中新增的批註。 您現在可以在預備環境中新增批註,以確認變更已部署至資料庫,且頁面可正常運作。

  10. 請遵循相同的程式來部署至預備和生產環境。

    別忘了停用額外的腳本。 相較于測試組態檔,唯一的差異在於,您只會停用預備和生產設定檔中的一個腳本,因為它們已設定為只執行 aspnet-prod-data.sql

    預備和生產環境的認證是 admin 和 prodpwd。

    對於包含資料庫變更的實際生產應用程式更新,您通常也會在部署期間將應用程式離線,方法是在發佈和刪除之前上傳 app_offline.htm ,如 上一個教學課程中所見。

總結

您現在已使用 Code First 移轉 和 dbDacFx 提供者來部署包含資料庫變更的應用程式更新。

顯示 [講師] 頁面的螢幕擷取畫面,其中顯示其 [姓名]、[雇用日期]、[生日] 和 [辦公室工作分派]。

UserInfo 頁面的螢幕擷取畫面,其中顯示 UserName 測試和批註 Tom 的測試帳戶。

下一個教學課程示範如何使用命令列執行部署。