使用 Visual Studio 或 Visual Web Developer 部署具有SQL Server Compact的 ASP.NET Web 應用程式:部署資料庫更新 - 9/12

By Tom Dykstra

下載入門專案

本系列教學課程說明如何使用 Visual Studio 2012 RC 或 Visual Studio Express 2012 RC for Web,部署 (發佈) ASP.NET 包含 SQL Server Compact 資料庫的 web 應用程式專案。 如果您安裝 Web 發佈更新,您也可以使用 Visual Studio 2010。 如需系列簡介,請參閱 系列的第一個教學課程。

如需示範 Visual Studio 2012 RC 版本之後所引進部署功能的教學課程,示範如何部署 SQL Server Compact 以外的SQL Server版本,並示範如何部署至 Azure App 服務 Web Apps,請參閱使用 Visual Studio ASP.NET Web 部署

概觀

在本教學課程中,您會進行資料庫變更和相關程式碼變更、測試 Visual Studio 中的變更,然後將更新部署至測試和生產環境。

提醒:如果您在完成教學課程時收到錯誤訊息或某些專案無法運作,請務必檢查 疑難排解頁面

將新資料行新增至資料表

在本節中,您會將生日資料行新增至 PersonInstructor 實體的 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 專案中,開啟 Instructors.aspx 並新增範本欄位以顯示生日。 在雇用日期和辦公室工作分派之間新增它:

<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>

(如果程式碼縮排同步,您可以按 CTRL-K,然後按 CTRL-D 自動重新格式化 file.)

建置方案,然後開啟 [ 套件管理員主控台] 視窗。 請確定 ContosoUniversity.DAL 仍選取為 [預設] 專案

在 [ 套件管理員主控台] 視窗中,選取 [ContosoUniversity.DAL ] 作為 [預設] 專案,然後輸入下列命令:

add-migration AddBirthDate

當此命令完成時,Visual Studio 會開啟定義新 DbMigration 類別的類別檔案,然後在 方法中 Up ,您可以看到建立新資料行的程式碼。

AddBirthDate_migration_code

建置解決方案,然後在 [ 套件管理員主控台] 視窗中輸入下列命令, (確定仍選取 ContosoUniversity.DAL 專案) :

update-database

當命令完成時,請執行應用程式並選取 Instructors 頁面。 當頁面載入時,您會看到它具有新的生日欄位。

Instructors_page_with_birth_date

將資料庫更新部署至測試環境

方案總管選取 ContosoUniversity 專案。

[Web One Click Publish ] 工具列中,選取 [測試 發佈設定檔],然後按一下 [ 發佈 Web]。 (如果工具列已停用,請選取方案總管.) 中的 ContosoUniversity 專案

Visual Studio 會部署更新的應用程式,而瀏覽器會開啟至首頁。 執行 Instructors 頁面以確認更新已成功部署。 當應用程式嘗試存取此頁面的資料庫時,Code First 會更新資料庫架構並執行 Seed 方法。 當頁面顯示時,您會看到預期的 [生日] 資料行,其中包含日期。

Instructors_page_with_birth_date_Test

將資料庫更新部署至生產環境

您現在可以部署到生產環境。 唯一的差別在於,您將使用 app_offline.htm 來防止使用者存取網站,進而在部署變更時更新資料庫。 針對生產環境部署,請執行下列步驟:

  • app_offline.htm 檔案上傳至生產網站。
  • 在 Visual Studio 中,選擇 [Web One Click Publish ] 工具列中的 [生產] 設定檔,然後按一下 [ 發佈 Web]。
  • 從生產網站刪除 app_offline.htm 檔案。

注意

當您的應用程式在生產環境中使用時,您應該實作備份計畫。 也就是說,您應該定期將 School-Prod.sdfaspnet-Prod.sdf 檔案從生產網站複製到安全的儲存位置,而且您應該保留數代這類備份。 當您更新資料庫時,應該在變更之前立即建立備份複本。 然後,如果您在將它部署至生產環境之後才發現錯誤,您仍然可以將資料庫復原到它損毀之前的狀態。

當 Visual Studio 在瀏覽器中開啟首頁 URL 時, 會顯示app_offline.htm 頁面。 刪除 app_offline.htm 檔案之後,您可以再次流覽至首頁,以確認已成功部署更新。

Instructors_page_with_birth_date_Prod

您現在已部署應用程式更新,其中包含測試與生產環境的資料庫變更。 下一個教學課程說明如何將資料庫從 SQL Server Compact 移轉至SQL Server Express和SQL Server。