使用 Visual Studio ASP.NET Web 部署:部署資料庫更新
本教學課程系列說明如何使用 Visual Studio 2012 或 Visual Studio 2010,將 ASP.NET Web 應用程式部署到 Azure App 服務 Web Apps 或第三方主控提供者。 如需系列的相關信息,請參閱 系列中的第一個教學課程。
概觀
在本教學課程中,您會進行資料庫變更和相關程式代碼變更、測試 Visual Studio 中的變更,然後將更新部署至測試、預備和生產環境。
本教學課程會先示範如何更新由 Code First 移轉 管理的資料庫,然後稍後會示範如何使用 dbDacFx 提供者更新資料庫。
提醒:如果您在進行教學課程時收到錯誤訊息或某些項目無法運作,請務必檢查 疑難解答頁面。
使用 Code First 移轉 部署資料庫更新
在本節中,您會將出生日期數據行新增至 和 Instructor
實體的Person
Student
基類。 然後,您會更新顯示講師數據的頁面,使其顯示新的數據行。 最後,您將變更部署至測試、預備和生產環境。
將數據行新增至應用程式資料庫中的數據表
在 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") } };
建置方案,然後開啟 [封裝管理員 控制台] 視窗。 確定 ContosoUniversity.DAL 仍選取為 [預設] 專案。
在 [封裝管理員 控制台] 視窗中,選取 [ContosoUniversity.DAL] 作為 [預設] 專案,然後輸入下列命令:
add-migration AddBirthDate
當此命令完成時,Visual Studio 會開啟定義新
DbMigration
類別的類別檔案,並在方法中看到Up
建立新數據行的程序代碼。 方法Up
會在實作變更時建立數據行,而Down
方法會在復原變更時刪除數據行。建置方案,然後在 [封裝管理員 控制台] 視窗中輸入下列命令(確定仍選取 ContosoUniversity.DAL 專案):
update-database
Entity Framework 會執行
Up
方法,然後執行Seed
方法。
在 Instructors 頁面中顯示新的數據行
在 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 自動重新格式化檔案。
執行應用程式,然後按兩下 Instructors 連結。
當頁面載入時,您會看到其具有新的出生日期欄位。
關閉瀏覽器。
部署資料庫更新
在 方案總管 選取 ContosoUniversity 專案。
在 [Web One Click Publish] 工具列中,按兩下 [測試發佈配置檔],然後按兩下 [發佈 Web]。 (如果工具列已停用,請選取 中的 ContosoUniversity 專案方案總管.)
Visual Studio 會部署更新的應用程式,而瀏覽器會開啟至首頁。
執行 Instructors 頁面,確認已成功部署更新。
當應用程式嘗試存取此頁面的資料庫時,Code First 會更新資料庫架構並執行
Seed
方法。 當頁面顯示時,您會看到預期的 [出生日期] 數據 行,其中包含日期。在 [Web One Click Publish] 工具列中,按兩下 [預備發行配置檔],然後按兩下 [發佈 Web]。
在 預備環境中執行 Instructors 頁面,以確認更新已成功部署。
在 [Web One Click Publish] 工具列中,按兩下 [生產發佈配置檔],然後按兩下 [發佈 Web]。
在生產環境中執行 Instructors 頁面,以確認更新已成功部署。
針對包含資料庫變更的實際生產應用程式更新,您通常也會使用 app_offline.htm 在部署期間讓應用程式脫機,如上一個教學課程所示。
使用 dbDacFx 提供者部署資料庫更新
在本節中,您會將 [批注] 數據行新增至成員資格資料庫中的 [使用者] 數據表,並建立一個頁面,讓您顯示和編輯每個使用者的批注。 然後,您要部署變更以測試、預備和生產環境。
將數據行加入成員資格資料庫中的數據表
在 Visual Studio 中,開啟 SQL Server 物件總管。
展開 [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 物件總管 視窗。
以滑鼠右鍵按兩下 [使用者 ] 資料表,然後按兩下 [ 檢視設計工具]。
在設計工具中,新增 [批注] 數據行,並使它成為 nvarchar(128) 和可為 Null,然後按兩下 [更新]。
在 [ 預覽資料庫更新 ] 方塊中,按兩下 [ 更新資料庫]。
建立頁面以顯示和編輯新數據行
在 方案總管 中,以滑鼠右鍵按兩下 ContosoUniversity 專案中的 [帳戶] 資料夾,按兩下 [新增],然後按下 [新增專案]。
使用主版頁面建立新的 Web 窗體,並將其命名為UserInfo.aspx。 接受預設 的 Site.Master 檔案作為主版頁面。
將下列標記
MainContent
Content
複製到 元素中(3Content
個項目的最後一個):<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>
以滑鼠右鍵按兩下 UserInfo.aspx 頁面,然後按兩下 [在瀏覽器中檢視]。
使用您的 系統管理員 使用者認證登入(密碼為 devpwd),並將一些批註新增至使用者,以確認頁面是否正常運作。
關閉瀏覽器。
部署資料庫更新
若要使用 dbDacFx 提供者進行部署,您只需在發行配置檔中選取 [更新資料庫] 選項即可。 不過,當您使用此選項時,針對初始部署,您也會設定一些額外的 SQL 腳本來執行:這些腳本仍在設定檔中,您必須防止它們再次執行。
以滑鼠右鍵按兩下 ContosoUniversity 項目,然後按兩下 [發佈],以開啟 [發佈 Web 精靈]。
選取 [ 測試 配置檔]。
按一下 [Settings] \(設定\) 索引標籤。
在 [DefaultConnection] 下,選取 [更新資料庫]。
停用您設定為針對初始部署執行的其他文稿:
- 按兩下 [ 設定資料庫更新]。
- 在 [設定資料庫更新] 對話框中,清除Grant.sql和aspnet-data-dev.sql旁的複選框。
- 按一下 [關閉] 。
按兩下 [預覽] 索引標籤。
在 [資料庫] 和 [DefaultConnection] 右側的 [預覽資料庫] 連結下。
預覽視窗會顯示將在目的地資料庫中執行的腳本,讓該資料庫架構符合源資料庫的架構。 文本包含新增數據行的 ALTER TABLE 命令。
關閉 [ 資料庫預覽] 對話框,然後按兩下 [ 發佈]。
Visual Studio 會部署更新的應用程式,而瀏覽器會開啟至首頁。
執行 UserInfo 頁面 (將 Account/UserInfo.aspx 新增至首頁 URL),以確認更新已成功部署。 您必須輸入 系統管理員 和 devpwd 來登入。
數據表中的數據預設不會部署,而且您未設定要執行的數據部署腳本,因此您將找不到您在開發中新增的批註。 您現在可以在預備階段中新增批註,以確認變更已部署至資料庫,而且頁面正常運作。
請遵循相同的程式來部署至預備和生產環境。
別忘了停用額外的腳本。 與測試配置檔相比,唯一的差異在於,您只會停用預備和生產環境配置檔中的一個腳本,因為它們已設定為只 執行aspnet-prod-data.sql。
預備和生產環境的認證是系統管理員和 prodpwd。
針對包含資料庫變更的實際生產應用程式更新,您通常也會在部署期間將應用程式離線,方法是在發佈和刪除應用程式之前先上傳app_offline.htm,如您在上一個教學課程中所見。
摘要
您現在已使用 Code First 移轉和 dbDacFx 提供者來部署包含資料庫變更的應用程式更新。
下一個教學課程說明如何使用命令行執行部署。