演講者:Tom Dykstra
本教學課程系列介紹如何使用 Visual Studio 2012 或 Visual Studio 2010 將 ASP.NET Web 應用程式部署 (發佈) 至 Azure App Service Web Apps 或第三方託管提供者。 如需本系列的資訊,請參閱本系列的第一個教學課程。
概觀
在本教學課程中,您將進行資料庫變更和相關的程式碼更改,然後在 Visual Studio 中測試這些變更,接著將更新部署到測試、預備和生產環境。
本教學課程首先示範如何更新由 Code First 遷移管理的資料庫,然後示範如何使用 dbDacFx 提供者更新資料庫。
提醒:如果您在進行教學課程時遇到錯誤訊息或某些功能無法正常運作,請務必檢查疑難排解頁面。
使用 Code First 遷移部署資料庫更新
在本部分中,您將出生日期欄位新增至 Student 和 Instructor 實體的 Person 基底類別。 然後,您更新顯示講師資料的頁面,使其顯示新欄位。 最後,將變更部署到測試、預備和生產。
在應用程式資料庫中的表格新增一列
在 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-databaseEntity Framework 會執行
Up方法,然後執行Seed方法。
在「講師」頁面中顯示新列
在 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 自動重新格式化檔案。)
執行該應用程式並點擊「講師」連結。
載入頁面時,您會看到它具有新的出生日期欄位。

關閉瀏覽器。
部署資料庫更新
在「方案總管」中,選擇 ContosoUniversity 專案。
在「Web 一鍵發佈」工具列中,選擇「測試」發佈設定檔,然後按一下「發佈 Web」。 (如果工具列已停用,請在方案總管中選擇 ContosoUniversity 專案。)
Visual Studio 部署更新的應用程式,瀏覽器將開啟首頁。
執行「講師」頁面以驗證更新是否已成功部署。
當應用程式嘗試存取此頁面的資料庫時,Code First 會更新資料庫架構並執行
Seed方法。 當頁面顯示時,您會看到包含日期的預期出生日期列。在「Web 一鍵發佈」工具列中,按一下「預備」發佈設定檔,然後按一下「發佈 Web」。
在預備階段執行「講師」頁面以驗證更新是否已成功部署。
在「Web 一鍵發佈」工具列中,按一下「生產」發佈設定檔,然後按一下「發佈 Web」。
在生產階段執行「講師」頁面以驗證更新是否已成功部署。
對於包含資料庫變更的實際生產應用程式更新,您通常也可以在部署期間使用 app_offline.htm 讓應用程式離線,如上一教學課程所示。
使用 dbDacFx 提供者部署資料庫更新
在本節中,您會將「註解」欄位新增至成員資格資料庫的「使用者」表中,並建立一個頁面來顯示和編輯每個使用者的註解。 然後將變更部署到測試、預備和生產環境。
將欄位新增至成員資格資料庫中的資料表中
在 Visual Studio 中,開啟 SQL Server Object Explorer。
展開 (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視窗。
以滑鼠以滑鼠右鍵按一下「使用者」表,然後按一下「檢視表設計工具」。

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

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

建立一個頁面來顯示和編輯新列
在方案總管中,以滑鼠以滑鼠右鍵按一下 ContosoUniversity 專案中的 Account 資料夾,按一下「新增」,然後按一下「新項目」。
建立一個新的「使用主版頁的 Web Form」,並將其命名為 UserInfo.aspx。 接受預設的 Site.Master 檔案作為主版頁。
將以下標記複製到
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>以滑鼠以滑鼠右鍵按一下 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),以驗證更新是否已成功部署。 您必須輸入 admin 和 devpwd 來登入。
表中的資料預設不會部署,且您沒有設定執行資料部署指令碼,因此您不會找到您在開發時新增的註解。 現在您可以在預備中新增註釋,以驗證變更是否已部署到資料庫以及頁面是否正常運作。
按照相同的流程部署到預備和生產。
不要忘記停用額外的指令碼。 與測試設定檔相比的唯一區別是,您將僅停用預備設定檔和生產設定檔中的一個指令碼,因為它們被設定為僅執行 aspnet-prod-data.sql。
預備和生產環境的認證 admin 和 prodpwd。
對於包含資料庫變更的實際生產應用程式更新,您通常還可以在部署期間透過在發佈之前上傳 app_offline.htm,並在發佈後刪除它來使應用程式離線,如先前的教學課程中所見。
摘要
您現在已經部署了一個應用程式更新,其中包括使用 Code First 遷移和 dbDacFx 提供者進行的資料庫變更。


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