共用方式為


使用 LINQ to SQL 建立模型類別 (VB)

Microsoft提供

下載 PDF

本教學課程的目標是說明建立 ASP.NET MVC 應用程式的模型類別的一種方法。 在本教學課程中,您將瞭解如何利用 Microsoft LINQ to SQL來建置模型類別和執行資料庫存取。

本教學課程的目標是說明建立 ASP.NET MVC 應用程式的模型類別的一種方法。 在本教學課程中,您將瞭解如何利用 Microsoft LINQ to SQL來建置模型類別和執行資料庫存取。

在本教學課程中,我們會建置基本的 Movie 資料庫應用程式。 我們一開始會以最快且最簡單的方式建立 Movie 資料庫應用程式。 我們會直接從控制器動作執行所有資料存取。

接下來,您將瞭解如何使用存放庫模式。 使用存放庫模式需要更多工作。 不過,採用此模式的優點是可讓您建置可適應變更的應用程式,而且可以輕鬆地進行測試。

什麼是模型類別?

MVC 模型包含 MVC 檢視或 MVC 控制器中未包含的所有應用程式邏輯。 特別是,MVC 模型包含您所有的應用程式商務和資料存取邏輯。

您可以使用各種不同的技術來實作資料存取邏輯。 例如,您可以使用 Microsoft Entity Framework、NHibernate、Subsonic 或 ADO.NET 類別來建置資料存取類別。

在本教學課程中,我使用LINQ to SQL來查詢和更新資料庫。 LINQ to SQL提供與 Microsoft SQL Server 資料庫互動的非常簡單方法。 不過,請務必瞭解 ASP.NET MVC 架構不會以任何方式系結至LINQ to SQL。 ASP.NET MVC 與任何資料存取技術相容。

建立電影資料庫

在本教學課程中-- 為了說明如何建置模型類別 -- 我們會建置簡單的 Movie 資料庫應用程式。 第一個步驟是建立新的資料庫。 以滑鼠右鍵按一下 [方案總管] 視窗中的 [App_Data] 資料夾,然後選取功能表選項 [新增]、[新增專案]。 選取SQL Server資料庫範本,將名稱命名為 MoviesDB.mdf,然後按一下 [新增] 按鈕, (請參閱圖 1) 。

新增SQL Server資料庫

圖 01:新增SQL Server資料庫 (按一下以檢視大小完整的映射)

建立新的資料庫之後,您可以按兩下 App_Data 資料夾中的 MoviesDB.mdf 檔案來開啟資料庫。 按兩下 MoviesDB.mdf 檔案會開啟 [伺服器總管] 視窗, (請參閱圖 2) 。

使用 Visual Web Developer 時,[伺服器總管] 視窗稱為 [資料庫總管] 視窗。

[伺服器總管] 視窗的螢幕擷取畫面,其中顯示 [資料表] 資料夾已醒目提示在資料夾階層中。

圖 02:使用 [伺服器總管] 視窗 (按一下以檢視完整大小的映射)

我們需要將一個資料表新增至代表電影的資料庫。 以滑鼠右鍵按一下 [資料表] 資料夾,然後選取 [ 新增資料表] 功能表選項。 選取此功能表選項會開啟 [資料表Designer (請參閱圖 3) 。

Microsoft Visual Studio 視窗的螢幕擷取畫面,其中顯示 [資料表Designer] 功能。

圖 03:資料表Designer (按一下即可檢視大小完整的影像)

我們需要將下列資料行新增至資料庫資料表:

資料行名稱 資料類型 允許 Null
Id Int
標題 NVarchar (200)
導演 NVarchar (50)

您必須對 [識別碼] 資料行執行兩項特殊動作。 首先,您必須選取資料表Designer中的資料行,然後按一下索引鍵的圖示,將 [識別碼] 資料行標示為主鍵資料行。 LINQ to SQL需要您在對資料庫執行插入或更新時指定主鍵資料行。

接下來,您必須將 [是] 值指派給 Is Identity 屬性,以將 [識別碼] 資料行標示為 [識別] 資料行, (請參閱圖 3) 。 [識別] 資料行是一個資料行,每當您將新資料列加入資料表時,就會自動指派新數位。

進行這些變更之後,請使用 tblMovie 名稱儲存資料表。 您可以按一下 [儲存] 按鈕來儲存資料表。

建立LINQ to SQL類別

我們的 MVC 模型將包含代表 tblMovie 資料庫資料表的LINQ to SQL類別。 建立這些LINQ to SQL類別最簡單的方法是以滑鼠右鍵按一下 Models 資料夾,選取 [新增]、[新增專案]、選取 [LINQ to SQL類別] 範本、為類別命名 Movie.dbml,然後按一下 [新增] 按鈕 (請參閱圖 4) 。

建立LINQ to SQL類別

圖 04:建立LINQ to SQL類別 (按一下以檢視大小完整的映射)

在您建立電影LINQ to SQL類別之後,就會立即顯示物件關聯式設計工具。 您可以將資料庫資料表從 [伺服器總管] 視窗拖曳到物件關聯式設計工具,以建立代表特定資料庫資料表的LINQ to SQL類別。 我們需要將 tblMovie 資料庫資料表新增至物件關聯式設計工具 (,請參閱圖 4) 。

使用 物件關聯式設計工具

圖 05:使用 [物件關聯式設計工具 (按一下以檢視完整大小的影像)

根據預設,物件關聯式設計工具會建立與拖曳至Designer的資料庫資料表名稱完全相同的類別。 不過,我們不想呼叫類別 tblMovie。 因此,按一下Designer中的類別名稱,然後將類別的名稱變更為 Movie。

最後,請記得按一下 [儲存] 按鈕, () 的圖片來儲存LINQ to SQL類別。 否則,LINQ to SQL類別將不會由物件關聯式設計工具產生。

在控制器動作中使用LINQ to SQL

既然我們已經有LINQ to SQL類別,我們可以使用這些類別從資料庫擷取資料。 在本節中,您會瞭解如何直接在控制器動作內使用LINQ to SQL類別。 我們會在 MVC 檢視中顯示 tblMovies 資料庫資料表中的電影清單。

首先,我們需要修改 HomeController 類別。 您可以在應用程式的 Controllers 資料夾中找到這個類別。 修改 類別,使其看起來像清單 1 中的 類別。

清單 1 – Controllers\HomeController.vb

<HandleError()> _
Public Class HomeController

     Inherits System.Web.Mvc.Controller

     Function Index()
          Dim dataContext As New MovieDataContext()
          Dim movies = From m In dataContext.Movies _
               Select m
          return View(movies)
     End Function
End Class

清單 1 中的 Index () 巨集指令會使用 LINQ to SQL DataCoNtext 類別 (MovieDataCoNtext) 來代表 MoviesDB 資料庫。 MoveDataCoNtext 類別是由 Visual Studio 物件關聯式設計工具所產生。

LINQ 查詢會針對 DataCoNtext 執行,以從 tblMovies 資料庫資料表擷取所有電影。 電影清單會指派給名為 movies 的區域變數。 最後,影片清單會透過檢視資料傳遞至檢視。

為了顯示電影,我們接下來必須修改 [索引] 檢視。 您可以在 Views\Home\ 資料夾中找到索引檢視。 更新 [索引] 檢視,使其看起來像清單 2 中的檢視。

清單 2 – Views\Home\Index.aspx

<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="MvcApplication1.Index" %>
<%@ Import Namespace="MvcApplication1" %>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">

<ul>
<%  For Each m As Movie In ViewData.Model%>
    <li><%= m.Title %></li>
<% Next%>
</ul>
</asp:Content>

請注意,修改過的索引檢視包含 < 檢視頂端的 %@ 匯入命名空間 % > 指示詞。 這個指示詞會匯入 MvcApplication1 命名空間。 我們需要此命名空間,才能使用模型類別,特別是檢視中的 Movie 類別 。

清單 2 中的檢視包含 For Each 迴圈,逐一查看 ViewData.Model 屬性所代表的所有專案。 每個電影都會顯示 Title 屬性的值。

請注意,ViewData.Model 屬性的值會轉換成 IEnumerable。 這是必要的,才能迴圈查看 ViewData.Model 的內容。 此處的另一個選項是建立強型別檢視。 當您建立強型別檢視時,會將 ViewData.Model 屬性轉換成檢視程式碼後置類別中的特定類型。

如果您在修改 HomeController 類別和 [索引] 檢視之後執行應用程式,您將會收到空白頁面。 您將會收到空白頁面,因為 tblMovies 資料庫資料表中沒有電影記錄。

若要將記錄新增至 tblMovies 資料庫資料表,請以滑鼠右鍵按一下 [伺服器總管] 視窗中的 tblMovies 資料庫資料表, (Visual Web Developer 中的 [資料庫總管] 視窗) ,然後選取功能表選項 [顯示資料表資料]。 您可以使用出現的方格來插入影片記錄, (請參閱圖 5) 。

插入電影

圖 06:插入電影 (按一下即可檢視全尺寸影像)

將一些資料庫記錄新增至 tblMovies 資料表並執行應用程式之後,您會看到圖 7 中的頁面。 所有電影資料庫記錄都會顯示在項目符號清單中。

使用索引檢視顯示電影

圖 07:使用 [索引] 檢視顯示電影 (按一下即可檢視全尺寸影像)

使用存放庫模式

在上一節中,我們直接在控制器動作內使用LINQ to SQL類別。 我們直接從 Index () 控制器動作使用 MovieDataCoNtext 類別。 在簡單應用程式的情況下,執行這項操作並無任何錯誤。 不過,當您需要建置更複雜的應用程式時,直接在控制器類別中使用LINQ to SQL會建立問題。

在控制器類別中使用LINQ to SQL,未來很難切換資料存取技術。 例如,您可能會決定從使用 Microsoft LINQ to SQL 切換為使用 Microsoft Entity Framework 作為資料存取技術。 在此情況下,您必須重寫存取應用程式內資料庫的每個控制器。

在控制器類別中使用LINQ to SQL,也很難為您的應用程式建置單元測試。 一般而言,您不想在執行單元測試時與資料庫互動。 您想要使用單元測試來測試應用程式邏輯,而不是資料庫伺服器。

若要建置更適合未來變更且更容易測試的 MVC 應用程式,您應該考慮使用存放庫模式。 當您使用存放庫模式時,您會建立包含所有資料庫存取邏輯的個別存放庫類別。

當您建立存放庫類別時,您會建立介面,代表存放庫類別所使用的所有方法。 在控制器內,您會針對 介面撰寫程式碼,而不是存放庫。 如此一來,您就可以在未來使用不同的資料存取技術來實作存放庫。

清單 3 中的介面名為 IMovieRepository,它代表名為 ListAll () 的單一方法。

清單 3 – Models\IMovieRepository.vb

Public Interface IMovieRepository
     Function ListAll() As IList(Of Movie)
End Interface

清單 4 中的存放庫類別會實作 IMovieRepository 介面。 請注意,它包含名為 ListAll () 的方法,對應至 IMovieRepository 介面所需的方法。

清單 4 – Models\MovieRepository.vb

Public Class MovieRepository Implements IMovieRepository
         Private _dataContext As MovieDataContext

         Public Sub New()
              _dataContext = New MovieDataContext()
         End Sub

         Public Function ListAll() As IList(Of Movie) Implements IMovieRepository.ListAll
              Dim movies = From m In _dataContext.Movies _
                   Select m
              Return movies.ToList()
         End Function
End Class

最後,清單 5 中的 MoviesController 類別會使用存放庫模式。 它不再直接使用LINQ to SQL類別。

清單 5 – Controllers\MoviesController.vb

using System.Web.Mvc;
using MvcApplication1.Models;

namespace MvcApplication1.Controllers
{
    Public Class MoviesController 
        Inherits System.Web.Mvc.Controller

             Private _repository As IMovieRepository

             Sub New()
                  Me.New(New MovieRepository())
             End Sub

             Sub New(ByVal repository As IMovieRepository)
                  _repository = repository
             End Sub

             Function Index()
                  Return View(_repository.ListAll())
             End Function
    End Class
}

請注意,清單 5 中的 MoviesController 類別有兩個建構函式。 當您的應用程式執行時,會呼叫第一個建構函式無參數建構函式。 此建構函式會建立 MovieRepository 類別的實例,並將它傳遞至第二個建構函式。

第二個建構函式具有單一參數:IMovieRepository 參數。 這個建構函式只會將 參數的值指派給名為 _repository 的類別層級欄位。

MoviesController 類別會利用稱為相依性插入模式的軟體設計模式。 特別是,它會使用稱為建構函式相依性插入的內容。 您可以閱讀 Martin Fowler 的下列文章,以深入瞭解此模式:

http://martinfowler.com/articles/injection.html

請注意,MoviesController 類別中的所有程式碼都 (,但第一個建構函式除外,) 與 IMovieRepository 介面互動,而不是實際的 MovieRepository 類別。 程式碼會與抽象介面互動,而不是介面的具體實作。

如果您想要修改應用程式所使用的資料存取技術,您可以直接使用使用替代資料庫存取技術的類別來實作 IMovieRepository 介面。 例如,您可以建立 EntityFrameworkMovieRepository 類別或 SubSonicMovieRepository 類別。 因為控制器類別是針對 介面進行程式設計,所以您可以將 IMovieRepository 的新實作傳遞給控制器類別,而 類別會繼續運作。

此外,如果您想要測試 MoviesController 類別,您可以將假電影存放庫類別傳遞至 MoviesController。 您可以使用實際上無法存取資料庫的類別來實作 IMovieRepository 類別,但包含 IMovieRepository 介面的所有必要方法。 如此一來,您就可以單元測試 MoviesController 類別,而不需要實際存取實際資料庫。

總結

本教學課程的目標是要示範如何利用 Microsoft LINQ to SQL來建立 MVC 模型類別。 我們已檢查兩種策略,以在 ASP.NET MVC 應用程式中顯示資料庫資料。 首先,我們已建立LINQ to SQL類別,並直接在控制器動作中使用類別。 在控制器內使用LINQ to SQL類別可讓您快速且輕鬆地在 MVC 應用程式中顯示資料庫資料。

接下來,我們探索了稍微困難但絕對更虛擬的路徑,用來顯示資料庫資料。 我們利用存放庫模式,並將所有資料庫存取邏輯放在個別的存放庫類別中。 在我們的控制器中,我們會針對介面撰寫所有程式碼,而不是具體類別。 存放庫模式的優點是,它可讓我們在未來輕鬆地變更資料庫存取技術,並讓我們輕鬆地測試控制器類別。