使用 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 移轉 部署資料庫更新
在本節中,您會將生日資料行新增至 Person
和 Instructor
實體的 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 自動重新格式化 file.)
執行應用程式,然後按一下 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 物件總管視窗。
以滑鼠右鍵按一下[使用者] 資料表,然後按一下[檢視Designer]。
在設計工具中,新增 [批註 ] 資料行,並將 它設為 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精靈]。
選取 [測試 設定檔]。
按一下 [設定] 索引標籤。
在 [DefaultConnection] 底下,選取 [更新資料庫]。
停用您設定為針對初始部署執行的其他腳本:
- 按一下 [ 設定資料庫更新]。
- 在 [設定資料庫更新] 對話方塊中,清除Grant.sql和aspnet-data-dev.sql旁的核取方塊。
- 按一下 [關閉] 。
按一下 [預覽] 索引標籤。
在 [資料庫] 和 [DefaultConnection] 右邊,按一下 [預覽資料庫 ] 連結。
預覽視窗會顯示將在目的地資料庫中執行的腳本,讓該資料庫架構符合源資料庫的架構。 腳本包含可加入新資料行的 ALTER TABLE 命令。
關閉 [ 資料庫預覽 ] 對話方塊,然後按一下 [ 發佈]。
Visual Studio 會部署更新的應用程式,而瀏覽器會開啟至首頁。
執行 UserInfo 頁面 (將 Account/UserInfo.aspx 新增至首頁 URL) ,以確認更新已成功部署。 您必須輸入 admin 和 devpwd來登入。
資料表中的資料預設不會部署,而且您未設定要執行的資料部署腳本,因此找不到您在開發中新增的批註。 您現在可以在預備環境中新增批註,以確認變更已部署至資料庫,且頁面可正常運作。
請遵循相同的程式來部署至預備和生產環境。
別忘了停用額外的腳本。 相較于測試組態檔,唯一的差異在於,您只會停用預備和生產設定檔中的一個腳本,因為它們已設定為只執行 aspnet-prod-data.sql。
預備和生產環境的認證是 admin 和 prodpwd。
對於包含資料庫變更的實際生產應用程式更新,您通常也會在部署期間將應用程式離線,方法是在發佈和刪除之前上傳 app_offline.htm ,如 上一個教學課程中所見。
總結
您現在已使用 Code First 移轉 和 dbDacFx 提供者來部署包含資料庫變更的應用程式更新。
下一個教學課程示範如何使用命令列執行部署。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應