共用方式為


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

演講者:Tom Dykstra

下載入門專案

本教學課程系列介紹如何使用 Visual Studio 2012 或 Visual Studio 2010 將 ASP.NET Web 應用程式部署 (發佈) 至 Azure App Service Web Apps 或第三方託管提供者。 如需本系列的資訊,請參閱本系列的第一個教學課程

概觀

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

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

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

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

在本部分中,您將出生日期欄位新增至 StudentInstructor 實體的 Person 基底類別。 然後,您更新顯示講師資料的頁面,使其顯示新欄位。 最後,將變更部署到測試、預備和生產。

在應用程式資料庫中的表格新增一列

  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 方法。

在「講師」頁面中顯示新列

  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. 執行該應用程式並點擊「講師」連結。

    載入頁面時,您會看到它具有新的出生日期欄位。

    講師頁面的螢幕擷取畫面,顯示他們的姓名、僱用日期、出生日期和辦公室分配。

  3. 關閉瀏覽器。

部署資料庫更新

  1. 在「方案總管」中,選擇 ContosoUniversity 專案。

  2. 在「Web 一鍵發佈」工具列中,選擇「測試」發佈設定檔,然後按一下「發佈 Web」。 (如果工具列已停用,請在方案總管中選擇 ContosoUniversity 專案。)

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

  3. 執行「講師」頁面以驗證更新是否已成功部署。

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

  4. 在「Web 一鍵發佈」工具列中,按一下「預備」發佈設定檔,然後按一下「發佈 Web」。

  5. 在預備階段執行「講師」頁面以驗證更新是否已成功部署。

  6. 在「Web 一鍵發佈」工具列中,按一下「生產」發佈設定檔,然後按一下「發佈 Web」。

  7. 在生產階段執行「講師」頁面以驗證更新是否已成功部署。

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

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

在本節中,您會將「註解」欄位新增至成員資格資料庫的「使用者」表中,並建立一個頁面來顯示和編輯每個使用者的註解。 然後將變更部署到測試、預備和生產環境。

將欄位新增至成員資格資料庫中的資料表中

  1. 在 Visual Studio 中,開啟 SQL Server Object Explorer

  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 Object Explorer視窗。

  3. 以滑鼠以滑鼠右鍵按一下「使用者」表,然後按一下「檢視表設計工具」。

    SSOX 檢視表設計工具

  4. 在設計工具中,新增「註解」列並將其設為 nvarchar(128) 且可為空,然後按一下「更新」。

    新增註解列

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

    預覽資料庫更新

建立一個頁面來顯示和編輯新列

  1. 方案總管中,以滑鼠以滑鼠右鍵按一下 ContosoUniversity 專案中的 Account 資料夾,按一下「新增」,然後按一下「新項目」。

  2. 建立一個新的「使用主版頁的 Web Form」,並將其命名為 UserInfo.aspx。 接受預設的 Site.Master 檔案作為主版頁。

  3. 將以下標記複製到 MainContent Content 元素中 (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 測試和 Comment 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),以驗證更新是否已成功部署。 您必須輸入 admindevpwd 來登入。

    表中的資料預設不會部署,且您沒有設定執行資料部署指令碼,因此您不會找到您在開發時新增的註解。 現在您可以在預備中新增註釋,以驗證變更是否已部署到資料庫以及頁面是否正常運作。

  10. 按照相同的流程部署到預備和生產。

    不要忘記停用額外的指令碼。 與測試設定檔相比的唯一區別是,您將僅停用預備設定檔和生產設定檔中的一個指令碼,因為它們被設定為僅執行 aspnet-prod-data.sql

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

    對於包含資料庫變更的實際生產應用程式更新,您通常還可以在部署期間透過在發佈之前上傳 app_offline.htm,並在發佈後刪除它來使應用程式離線,如先前的教學課程中所見。

摘要

您現在已經部署了一個應用程式更新,其中包括使用 Code First 遷移和 dbDacFx 提供者進行的資料庫變更。

顯示「講師」頁面的螢幕擷取畫面,其中顯示了他們的姓名、僱用日期、出生日期和辦公室分配。

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

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