共用方式為


使用 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 移轉 部署資料庫更新

在本節中,您會將出生日期數據行新增至 和 Instructor 實體的PersonStudent基類。 然後,您會更新顯示講師數據的頁面,使其顯示新的數據行。 最後,您將變更部署至測試、預備和生產環境。

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

  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 自動重新格式化檔案。

  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. 以滑鼠右鍵按兩下 [使用者 ] 資料表,然後按兩下 [ 檢視設計工具]。

    SSOX 檢視設計工具

  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. 按一下 [Settings] \(設定\) 索引標籤。

  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),以確認更新已成功部署。 您必須輸入 系統管理員devpwd 來登入。

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

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

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

    預備和生產環境的認證是系統管理員和 prodpwd。

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

摘要

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

顯示 [講師] 頁面的螢幕快照,其中顯示其名稱、僱用日期、出生日期和 Office 工作分派。

UserInfo 頁面的螢幕快照,其中顯示UserName測試和批注 Tom 的測試帳戶。

下一個教學課程說明如何使用命令行執行部署。