Share via


使用 Entity Framework 建立模型類別 (VB)

Microsoft提供

在本教學課程中,您將瞭解如何搭配 Microsoft Entity Framework 使用 ASP.NET MVC。 您將瞭解如何使用實體精靈來建立 ADO.NET 實體資料模型。 在本教學課程中,我們會建置 Web 應用程式,說明如何使用 Entity Framework 來選取、插入、更新和刪除資料庫資料。

本教學課程的目標是說明如何在建置 ASP.NET MVC 應用程式時,使用 Microsoft Entity Framework 建立資料存取類別。 本教學課程假設先前沒有 Microsoft Entity Framework 的知識。 在本教學課程結束時,您將瞭解如何使用 Entity Framework 來選取、插入、更新和刪除資料庫記錄。

Microsoft Entity Framework 是物件關聯式對應 (O/RM) 工具,可讓您自動從資料庫產生資料存取層。 Entity Framework 可讓您避免手動建置資料存取類別的繁瑣工作。

注意

ASP.NET MVC 與 Microsoft Entity Framework 之間沒有必要的連線。 Entity Framework 有數個替代方法,您可以搭配 ASP.NET MVC 使用。 例如,您可以使用其他 O/RM 工具來建置 MVC 模型類別,例如 Microsoft LINQ to SQL、NHibernate 或 SubSonic。

為了說明如何使用 Microsoft Entity Framework 搭配 ASP.NET MVC,我們將建置簡單的範例應用程式。 我們將建立電影資料庫應用程式,讓您能夠顯示和編輯電影資料庫記錄。

本教學課程假設您有 Visual Studio 2008 或 Visual Web Developer 2008 搭配 Service Pack 1。 您需要 Service Pack 1 才能使用 Entity Framework。 您可以從下列位址下載 Visual Studio 2008 Service Pack 1 或 Visual Web Developer with Service Pack 1:

https://www.asp.net/downloads/

建立電影範例資料庫

Movie Database 應用程式會使用名為 Movies 的資料庫資料表,其中包含下列資料行:

資料行名稱 資料類型 允許 Null? 主鍵是嗎?
Id int False True
標題 nvarchar(100) False
導演 nvarchar(100) False

您可以遵循下列步驟,將此資料表新增至 ASP.NET MVC 專案:

  1. 以滑鼠右鍵按一下方案總管視窗中的 [App_Data] 資料夾,然後選取功能表選項 [新增]、[新增專案]。
  2. 從 [新增專案] 對話方塊中,選取[SQL Server資料庫],為資料庫指定名稱 MoviesDB.mdf,然後按一下 [新增] 按鈕。
  3. 按兩下 MoviesDB.mdf 檔案,以開啟 [伺服器總管/資料庫總管] 視窗。
  4. 展開 MoviesDB.mdf 資料庫連線,以滑鼠右鍵按一下 [資料表] 資料夾,然後選取功能表選項 [ 新增資料表]。
  5. 在 [資料表] Designer中,新增 [識別碼]、[標題] 和 [Director] 資料行。
  6. 按一下 [ 儲存 ] 按鈕, (其具有磁片) 圖示,以儲存名稱為 Movies 的新資料表。

建立 Movies 資料庫資料表之後,您應該將一些範例資料新增至資料表。 以滑鼠右鍵按一下 Movies 資料表,然後選取功能表選項 [顯示資料表資料]。 您可以在出現的方格中輸入假電影資料。

建立 ADO.NET 實體資料模型

若要使用 Entity Framework,您必須建立實體資料模型。 您可以利用 Visual Studio 實體資料模型精靈 ,自動從資料庫產生實體資料模型。

請遵循下列步驟:

  1. 以滑鼠右鍵按一下 [方案總管] 視窗中的 [Models] 資料夾,然後選取功能表選項 [新增]、[新增專案]。
  2. 在 [ 新增專案 ] 對話方塊中,選取 [資料] 類別 (請參閱圖 1) 。
  3. 選取 [實體資料模型] 範本 ADO.NET,為實體資料模型 命名為 MoviesDBModel.edmx,然後按一下 [ 新增 ] 按鈕。 按一下 [ 新增] 按鈕會啟動 [資料模型精靈]。
  4. 在 [ 選擇模型內容 ] 步驟中,選擇 [ 從資料庫產生] 選項,然後按一下 [ 下一步 ] 按鈕, (請參閱圖 2) 。
  5. 在 [ 選擇您的資料連線 ] 步驟中,選取 MoviesDB.mdf 資料庫連線、輸入實體連線設定名稱 MoviesDBEntities,然後按一下 [ 下一步 ] 按鈕 (請參閱圖 3) 。
  6. 在 [ 選擇您的資料庫物件] 步驟中,選取 [電影] 資料庫資料表,然後按一下 [ 完成 ] 按鈕 (請參閱圖 4) 。

完成這些步驟之後,ADO.NET 實體資料模型Designer (實體Designer) 隨即開啟。

圖 1 – 建立新的實體資料模型

clip_image002

圖 2 – 選擇模型內容步驟

clip_image004

圖 3 – 選擇您的資料連線

clip_image006

圖 4 – 選擇您的資料庫物件

clip_image008

修改實體資料模型 ADO.NET

建立實體資料模型之後,您可以利用實體Designer (來修改模型,請參閱圖 5) 。 您可以隨時開啟 Entity Designer,方法是按兩下 [方案總管] 視窗中 [Models] 資料夾中所包含的 MoviesDBModel.edmx 檔案。

圖 5 – ADO.NET 實體資料模型Designer

clip_image010

例如,您可以使用 Entity Designer來變更實體模型資料精靈產生的類別名稱。 精靈建立了名為 Movies 的新資料存取類別。 換句話說,精靈會提供與資料庫資料表相同的類別名稱。 由於我們將使用此類別來代表特定的 Movie 實例,因此應該將類別從 Movies 重新命名為 Movie。

如果您想要重新命名實體類別,您可以按兩下 [實體] Designer中的類別名稱,然後輸入新的名稱 (請參閱圖 6) 。 或者,您可以在選取實體Designer中的實體之後,變更屬性視窗中實體的名稱。

圖 6 – 變更機構名稱

clip_image012

按一下 [儲存] 按鈕 (磁片) 圖示,記得在修改之後儲存實體資料模型。 在幕後,Entity Designer會產生一組 Visual Basic .NET 類別。 您可以開啟 MoviesDBModel 來檢視這些類別。從 方案總管 視窗Designer.vb 檔案。

請勿修改 Designer.vb 檔案中的程式碼,因為下次使用 Entity Designer時,將會覆寫您的變更。 如果您想要擴充在 Designer.vb 檔案中定義的實體類別功能,則可以在不同的檔案中建立部分類別

使用 Entity Framework 選取資料庫記錄

讓我們建立顯示電影記錄清單的頁面,開始建置電影資料庫應用程式。 清單 1 中的主控制器會公開名為 Index () 的動作。 Index () 巨集指令會利用 Entity Framework,從 Movie 資料庫資料表傳回所有電影記錄。

清單 1 – Controllers\HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Private _db As MoviesDBEntities

    Public Sub New()
        _db = New MoviesDBEntities()
    End Sub

    Public Function Index()
        ViewData.Model = _db.MovieSet.ToList()
        Return View()
    End Function

End Class

請注意,清單 1 中的控制器包含建構函式。 建構函式會初始化名為 _db 的類別層級欄位。 [_db] 欄位代表 Microsoft Entity Framework 所產生的資料庫實體。 _db欄位是 Entity Designer所產生的 MoviesDBEntities 類別實例。

_db欄位用於 Index () 巨集指令中,從 Movies 資料庫資料表擷取記錄。 運算式_db。MovieSet 代表 Movies 資料庫資料表中的所有記錄。 ToList () 方法可用來將電影集轉換成 Movie 物件的泛型集合:List ( Of Movie) 。

影片記錄會以LINQ to Entities的協助擷取。 清單 1 中的 Index () 巨集指令會使用 LINQ 方法語法 來擷取資料庫記錄集。 如果您想要的話,您可以改用 LINQ 查詢語法 。 下列兩個語句會執行非常相同的動作:

ViewData.Model = _db.MovieSet.ToList()
ViewData.Model = (from m in _db.MovieSet select m).ToList()

使用您最直覺的 LINQ 語法 – 方法語法或查詢語法。 這兩種方法之間的效能沒有任何差異,唯一的差異在於樣式。

清單 2 中的檢視是用來顯示電影記錄。

清單 2 – Views\Home\Index.aspx

<%@ Page Language="VB" 
  Inherits="System.Web.Mvc.ViewPage(Of List(Of MvcApplication1.Movie))" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Index</title>
</head>
<body>
    <div>
    
<%  For Each m In Model%>

    Title: <%= m.Title %>
    <br />
    Director: <%= m.Director %>
    <br />
    <%=Html.ActionLink("Edit", "Edit", New With {.id = m.Id})%>
    <%=Html.ActionLink("Delete", "Delete", New With {.id = m.Id})%>
       
        <hr />
<% Next%>
    
    <%= Html.ActionLink("Add Movie", "Add") %>
    
    </div>
</body>
</html>

清單 2 中的檢視包含 For Each 迴圈,逐一查看每個電影記錄,並顯示電影記錄的 Title 和 Director 屬性的值。 請注意,[編輯] 和 [刪除] 連結會顯示在每個記錄旁邊。 此外,[新增電影] 連結會出現在檢視底部, (請參閱圖 7) 。

圖 7 – 索引檢視

clip_image014

[索引] 檢 視是具類型的檢視。 索引檢視具有包含 < Inherits 屬性的 %@ Page % > 指示詞。 Inherits 屬性會將 ViewData.Model 屬性轉換成 Movie 物件的強型別泛型 List 集合 – List (Of Movie) 。

使用 Entity Framework 插入資料庫記錄

您可以使用 Entity Framework 輕鬆地將新記錄插入資料庫資料表。 清單 3 包含新增至 Home 控制器類別的兩個新動作,可用來將新記錄插入 Movie 資料庫資料表。

清單 3 – Controllers\HomeController.vb (Add 方法)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Add()
        Return View()
    End Function

    <AcceptVerbs(HttpVerbs.Post)> _
    Public Function Add(ByVal form As FormCollection)
        Dim movieToAdd As New Movie()

        ' Deserialize (Include white list!)
        TryUpdateModel(movieToAdd, New String() {"Title", "Director"}, form.ToValueProvider())

        ' Validate
        If String.IsNullOrEmpty(movieToAdd.Title) Then
            ModelState.AddModelError("Title", "Title is required!")
        End If
        If String.IsNullOrEmpty(movieToAdd.Director) Then
            ModelState.AddModelError("Director", "Director is required!")
        End If

        ' If valid, save movie to database
        If (ModelState.IsValid) Then
            _db.AddToMovieSet(movieToAdd)
            _db.SaveChanges()
            Return RedirectToAction("Index")
        End If

        ' Otherwise, reshow form
        Return View(movieToAdd)
    End Function

End Class

第一個 Add () 巨集指令只會傳回檢視。 檢視包含新增電影資料庫記錄的表單, (請參閱圖 8) 。 當您提交表單時,會叫用第二個 Add () 巨集指令。

請注意,第二個 Add () 巨集指令是以 AcceptVerbs 屬性裝飾。 只有在執行 HTTP POST 作業時,才能叫用此動作。 換句話說,只有在張貼 HTML 表單時,才能叫用此動作。

第二個 Add () 巨集指令會使用 ASP.NET MVC TryUpdateModel () 方法的協助,建立 Entity Framework Movie 類別的新實例。 TryUpdateModel () 方法會採用傳遞至 Add () 方法的 FormCollection 中的欄位,並將這些 HTML 表單欄位的值指派給 Movie 類別。

使用 Entity Framework 時,您必須在使用 TryUpdateModel 或 UpdateModel 方法時提供屬性的「安全清單」,以更新實體類別的屬性。

接下來,Add () 巨集指令會執行一些簡單的表單驗證。 動作會確認 Title 和 Director 屬性都有值。 如果發生驗證錯誤,則會將驗證錯誤訊息新增至 ModelState。

如果沒有驗證錯誤,則會使用 Entity Framework 的協助,將新的電影記錄新增至 Movies 資料庫資料表。 新的記錄會以下列兩行程式碼新增至資料庫:

_db.AddToMovieSet(movieToAdd)
_db.SaveChanges()

第一行程式碼會將新的 Movie 實體新增至 Entity Framework 所追蹤的電影集。 第二行程式碼會儲存對追蹤回基礎資料庫的 Movies 所做的任何變更。

圖 8 – 新增檢視

clip_image016

使用 Entity Framework 更新資料庫記錄

您可以遵循與 Entity Framework 編輯資料庫記錄幾乎相同的方法,如同我們剛才追蹤以插入新資料庫記錄的方法。 清單 4 包含兩個名為 Edit () 的新控制器動作。 第一個 Edit () 巨集指令會傳回 HTML 表單來編輯電影記錄。 第二個 Edit () 動作會嘗試更新資料庫。

清單 4 – Controllers\HomeController.vb (Edit 方法)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Edit(ByVal id As Integer)
        ' Get movie to update
        Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)
        ViewData.Model = movieToUpdate
        Return View()
    End Function

    <AcceptVerbs(HttpVerbs.Post)> _
    Public Function Edit(ByVal form As FormCollection)

        ' Get movie to update
        Dim id As Integer = Integer.Parse(form("id"))
        Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)

        ' Deserialize (Include white list!)
        TryUpdateModel(movieToUpdate, New String() {"Title", "Director"}, form.ToValueProvider)

        ' Validate
        If String.IsNullOrEmpty(movieToUpdate.Title) Then
            ModelState.AddModelError("Title", "Title is required!")
        End If
        If String.IsNullOrEmpty(movieToUpdate.Director) Then
            ModelState.AddModelError("Director", "Director is required!")
        End If

        ' If valid, save movie to database
        If (ModelState.IsValid) Then
            _db.SaveChanges()
            Return RedirectToAction("Index")
        End If

        ' Otherwise, reshow form
        Return View(movieToUpdate)
    End Function

End Class

第二個 Edit () 動作會從符合所編輯電影識別碼的資料庫擷取 Movie 記錄開始。 下列LINQ to Entities語句會擷取符合特定識別碼的第一個資料庫記錄:

Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)

接下來,TryUpdateModel () 方法可用來將 HTML 表單欄位的值指派給電影實體的屬性。 請注意,系統會提供安全清單來指定要更新的確切屬性。

接下來,會執行一些簡單的驗證,以確認電影標題和 Director 屬性都有值。 如果任一屬性遺漏值,則會將驗證錯誤訊息新增至 ModelState,而 ModelState.IsValid 會傳回 false 值。

最後,如果沒有驗證錯誤,則基礎 Movies 資料庫資料表會藉由呼叫 SaveChanges () 方法來更新任何變更。

編輯資料庫記錄時,您必須將正在編輯之記錄的識別碼傳遞給執行資料庫更新的控制器動作。 否則,控制器動作將不知道要在基礎資料庫中更新的記錄。 清單 5 中包含的 [編輯] 檢視包含隱藏的表單欄位,代表所編輯之資料庫記錄的識別碼。

清單 5 – Views\Home\Edit.aspx

<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage(Of MvcApplication1.Movie)" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Edit</title>
    <style type="text/css">
    
    .input-validation-error
    {
        background-color:Yellow;
    }
    
    </style>    
</head>
<body>
    <div>

<h1>Edit Movie</h1>

<form method="post" action="/Home/Edit">

    <!-- Include Hidden Id -->
    <%= Html.Hidden("id") %>

    Title:
    <br />
    <%= Html.TextBox("title") %>
    
    <br /><br />
    Director:
    <br />
    <%= Html.TextBox("director") %>
    
    <br /><br />
    <input type="submit" value="Edit Movie" />
</form>
    
    </div>
</body>
</html>

使用 Entity Framework 刪除資料庫記錄

在本教學課程中,我們需要處理的最終資料庫作業是刪除資料庫記錄。 您可以使用清單 6 中的控制器動作來刪除特定的資料庫記錄。

清單 6 -- \Controllers\HomeController.vb (刪除動作)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Delete(ByVal id As Integer)
        ' Get movie to delete
        Dim movieToDelete As Movie = _db.MovieSet.First(Function(m) m.Id = id)

        ' Delete 
        _db.DeleteObject(movieToDelete)
        _db.SaveChanges()

        ' Show Index view
        Return RedirectToAction("Index")
    End Function

End Class

Delete () 巨集指令會先擷取符合傳遞至動作之識別碼的 Movie 實體。 接下來,會呼叫 DeleteObject () 方法,後面接著 SaveChanges () 方法,從資料庫刪除電影。 最後,系統會將使用者重新導向回 [索引] 檢視。

總結

本教學課程的目的是要示範如何利用 ASP.NET MVC 和 Microsoft Entity Framework 來建置資料庫驅動 Web 應用程式。 您已瞭解如何建置可讓您選取、插入、更新和刪除資料庫記錄的應用程式。

首先,我們已討論如何使用實體資料模型精靈,從 Visual Studio 內產生實體資料模型。 接下來,您將瞭解如何使用 LINQ to Entities,從資料庫資料表擷取一組資料庫記錄。 最後,我們使用 Entity Framework 來插入、更新和刪除資料庫記錄。