創建Model類的方法(使用Linq)

這篇教程的目的是解釋一種爲ASP.NET MVC應用程序創建模型類的方法。在這篇教程中,你會學習到如何利用Microsoft LINQ to SQL創建模型類並執行數據庫訪問。 在這篇教程中,我們創建了一個基本的Movie數據庫應用程序。我們儘可能地用最快速和最簡單的方法創建Movie數據庫應用程序作爲開始。我們直接從控制器動作中執行了所有的數據訪問。 接下來,你會學習如何使用Repository模式。使用Repository模式需要更多的一點工作。然而,採用這個模式的優點是它允許你創建能夠適應變化並且測試簡單的應用程序。 1.什麼是Model類 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與任何的數據訪問技術都是兼容的。 2.創建一個Movie數據庫 在這篇教程中,爲了演示如何構建模型類――我們創建了一個簡單的Movie數據庫應用程序。第一步是創建一個新的數據庫。在解決方案瀏覽器窗口的App_Data文件夾上點擊右鍵,選擇菜單項“添加(Add)”,“新建項(New Item)”。選擇SQL Server Database模板,命名爲MoviesDB.mdf,並且點擊“添加(Add)”按鈕(如圖1)。 圖1:添加一個新的SQL Server Database 在你創建這個新的數據庫以後,可以通過在App_Data文件夾中雙擊MoviesDB.mdf文件來打開數據庫。雙擊MoviesDB.mdf文件會打開“服務器資源管理器(Server Explorer)”窗口(如圖2)。 當使用Visual Web Developer時,“服務器資源管理器”叫做“數據庫資源管理器(Database Explorer)”。 圖2:使用“服務器資源管理器”窗口 我們需要在數據庫中添加一個表,這個表代表電影。右鍵點擊Tables文件夾,並且選擇菜單項“添加新表(Add New Table)”。選擇這個菜單項會打開“表設計器(Table Designer)”(如圖3)。 圖3:表設計器 我們需要向我們的數據庫表添加下面的列: 列名 數據類型 允許Null Id Int False Title Nvarchar(200) False Director Nvarchar(50) False 你需要對Id列做兩件特別的事情。首先,你需要通過在表設計器中選擇列,並且點擊鑰匙圖標,將Id列標識爲主鍵列。當對數據庫進行插入或者更新時,LINQ to SQL要求你指定主鍵列。 接下來,你需要通過將IsIdentity屬性賦值爲Yes值,來將Id列標記爲Identity列(如圖3)。每當你向表中添加一行新數據時,Identity列會自動地賦一個新的數字。 3.創建LINQ to SQL類 我們的MVC模型類將會包含LINQ to SQL類,這些LINQ to SQL類代表着tblMovie數據庫表。創建LINQ to SQL最簡單的方法就是右鍵點擊Models文件夾,選擇“添加(Add)”,“新建項(New Item)”,選擇LINQ to SQL類模板,將類命名爲Movie.dbml,並且點擊“添加”按鈕(如圖4)。 圖4:創建LINQ to SQL類 在我們創建好Movie LINQ to SQL 類之後,會立即出現“對象關係設計器(Object Relational Designer)”。你可以將數據庫表從“服務器資源管理器(Server Explorer)”窗口中拖曳到“對象關係設計器”中,來創建代表着特定數據庫表的LINQ to SQL類。我們需要添加tblMovie數據庫表到“對象關係設計器”中(如圖5)。 圖5:使用“對象關係設計器” 默認情況下,“對象關係設計器”創建的類與你拖曳到設計器中的數據庫表名完全相同。然而,我們不想管我們的類叫做tblMovie。因此,在設計器中點擊類名,並且將類名改爲Movie。 最後,記得點擊“保存(Save)”按鈕來保存LINQ to SQL類。否則,LINQ to SQL類將不會由“對象關係設計器”生成。 4.在控制器動作中使用LINQ to SQL 現在我們已經擁有了LINQ to SQL類,我們可以使用這些類從數據庫中獲取數據。在本節中,你會學習如何直接在控制器動作中使用LINQ to SQL類。我們將會在一個MVC視圖中顯示來自tblMovies數據庫表中的電影列表。 首先,我們需要更改HomeController類。這個類可以在你應用程序中的Controllers文件夾中找到。修改這個類,使得它像代碼清單1所示的那樣。 代碼清單1 - Controllers/HomeController.cs using System.Linq; using System.Web.Mvc; using MvcApplication1.Models; namespace MvcApplication1.Controllers{ [HandleError] public class HomeController : Controller { public ActionResult Index(){ var dataContext = new MovieDataContext(); var movies = from m in dataContext.Movies select m; return View(movies); } } } 代碼清單1中的Index()動作使用了LINQ to SQL DataContext類(MovieDataContext)來代表MoviesDB數據庫。MovieDataContext類由Visual Studio“對象關係設計器”生成。 Index()動作執行了一個對DataContext的LINQ查詢,用於從tblMovies數據庫表中獲取所有的電影。電影列表被賦給了一個叫做movies的本地變量。最後,電影列表通過視圖數據傳遞給了視圖。 爲了顯示電影列表,我們接下來需要修改Index視圖。你可以在Views/Home/文件夾下找到Index視圖。更新Index視圖,讓它和代碼清單2中的視圖相同。 代碼清單2 - Views/Home/Index.aspx <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %> <%@ Import Namespace="MvcApplication1.Models" %>

  • <% foreach (Movie m in (IEnumerable)ViewData.Model) { %>
  • <%= m.Title %> <% } %>
注意到修改後的Index視圖在其頂部包含一個<%@import namespace%>指示符。這個指示符引入了MvcApplication1.Models命名空間。爲了處理model類,我們需要這個命名空間,尤其是――視圖中的Movie類。 代碼清單2中的視圖包含一個foreach循環,它遍歷了所有由ViewData.Model屬性所代表的項。顯示了每一個movie的Title屬性的值。 注意到ViewData.Model屬性被強制轉換爲了一個IEnumerable。爲了遍歷ViewData.Model的內容,這個是必需的。另一個選擇是創建一個強類型的視圖。當你創建一個強類型的視圖時,你將ViewData.Model屬性強制轉換爲視圖的後置代碼類中的特定類型。 如果你在修改了HomeController類和Index視圖後運行應用程序,你將會獲得一個空白頁。你之所以獲得一個空白頁,是因爲在tblMovies數據庫表中沒有movie記錄。 爲了向tblMovies數據庫表中添加記錄,右鍵點擊“服務器資源管理器”窗口(在Visual Web Developer中叫做“數據庫資源管理器”)中的tblMovies數據庫表,並且選擇菜單項“顯示錶格數據(Show Table Data)”。你可以使用所顯示的網格來插入movies記錄(如圖6)。 圖6:插入電影 在你向tblMovies表中添加了一些數據庫記錄以後,並且運行應用程序,你將會看到圖7所示的頁面。所有的movie數據庫記錄都顯示在了項目符號列表中。 圖7:使用Index視圖顯示電影 5.使用Repository模式 在前面一節中,我們直接在一個控制器動作中使用了LINQ to SQL。我們直接從Index()控制器動作中使用了MovieDataContext類。對於一個簡單的應用程序來說,這沒有什麼問題。然而,當你需要構建更加複雜的應用程序時,直接在控制器類中處理LINQ to SQL會造成一些問題。 在控制器類中使用LINQ to SQL會使以後切換數據訪問技術時出現困難。舉個例子,你可能想將Microsoft LINQ to SQL切換爲使用Microsoft Entity Framework,來作爲你的數據訪問技術。在這種情況下,你需要在應用程序中重寫每一個訪問數據庫的控制器。 在控制器類中使用LINQ to SQL也使得爲應用程序創建單元測試更爲困難。通常,在執行單元測試時,你不需要與數據庫進行交互。你想要使用單元測試來測試你的應用程序邏輯,而非你的數據庫服務器。 爲了構建更加適應未來變化以及更加易於測試的MVC應用程序,你應該考慮使用Repository模式。當你使用Repository模式時,你會創建一個獨立的repository類,它包含了所有的數據訪問邏輯。 當你創建repository類時,你創建了一個接口,該接口代表着所有由repository類所使用的方法。在你的控制器中,你針對接口編寫代碼,而不是針對repository。通過這種方式,你以後可以使用不同的數據訪問技術來實現repository。 代碼清單3中的接口命名爲了IMovieRepository,並且它包含了一個方法,叫做ListAll()。 代碼清單3 - Models/IMovieRepository.cs using System.Collections.Generic; namespace MvcApplication1.Models{ public interface IMovieRepository { IList ListAll(); } } 代碼清單4中的repository類實現了IMovieRepository接口。注意到它包含了一個叫做ListAll()的方法,該方法與IMovieRepository接口所要求的方法相對應。 代碼清單4 - Models/MovieRepository.cs using System.Collections.Generic; using System.Linq; namespace MvcApplication1.Models { public class MovieRepository : IMovieRepository { private MovieDataContext _dataContext; public MovieRepository() { _dataContext = new MovieDataContext(); } #region IMovieRepository Members public IList ListAll() { var movies = from m in _dataContext.Movies select m; return movies.ToList(); } #endregion } } 最後,代碼清單5中的MoviesController類使用了Repository模式。它不再直接使用LINQ to SQL類。 代碼清單5 - Controllers/MoviesController.cs using System.Web.Mvc; using MvcApplication1.Models; namespace MvcApplication1.Controllers { public class MoviesController : Controller { private IMovieRepository _repository; public MoviesController() : this(new MovieRepository()) { } public MoviesController(IMovieRepository repository) { _repository = repository; } public ActionResult Index() { return View(_repository.ListAll()); } } } 注意到代碼清單5中的MoviesController類有兩個構造函數。第一個構造函數,無參數的構造函數,在你應用程序運行時調用。這個構造函數創建了一個MovieRepository類的實例,並把它傳遞給了第二個構造函數。 第二個構造函數只有一個參數:一個IMovieRepository參數。這個構造函數簡單地將參數的值賦給了叫做_repository的類級字段。 MoviesController類利用了軟件設計模式中稱作依賴注入(Dependency Injection)的模式。特別地,它使用了構造函數依賴注入(Constructor Dependency Injection)。你可以通過閱讀下面這篇由Martin Fowler所作的文章,來閱讀更多關於這個模式的信息: http://martinfowler.com/articles/injection.html 注意到MoviesController類中所有的代碼(除了第一個構造函數)都與IMovieRepository接口進行交互,而不是實際的MovieRepository類。代碼與一個抽象的接口交互,而不是與接口的具體實現交互。 如果你想要修改應用程序所使用的數據訪問邏輯,那麼你可以簡單地用一個類實現IMovieRepository接口,該類使用不同的數據庫訪問技術。舉個例子,你可以創建一個EntityFrameworkMovieRepository類,或者一個SubSonicMovieRepository類。因爲控制器類針對接口編程,你可以向控制器類傳遞一個IMovieRepository的新實現,並且這個類將繼續工作。 除此以外,如果你想要測試MoviesController類,那麼你可以向HomeController傳遞一個僞movie Respository類。你可以使用一個實際上並沒有訪問數據庫,但是包含了所有IMovieRepository接口所要求的方法的類來實現IMovieRepository。通過這種方式,你可以對MoviesController類進行單元測試,而不需要實際地訪問一個真正的數據庫。 6.小結 這篇教程的目的是演示如何利用Microsoft LINQ to SQL創建MVC模型類。我們解釋了在ASP.NET MVC應用程序中顯示數據庫數據的兩種策略。首先,我們直接在控制器動作中創建和使用了LINQ to SQL類。在控制器中使用LINQ to SQL類使你能夠快速且容易地在MVC應用程序中顯示數據庫數據。 接下來,我們探索了一個稍微困難一點兒,但絕對是一個更好的途徑來顯示數據庫數據。我們利用了Repository模式,並且將所有的數據庫邏輯都放在了一個獨立的repository類中。在我們的控制器中,我們編寫的所有代碼都是針對一個接口,而非一個實體類。Repository模式的優點是它允許我們輕鬆地在以後改變數據訪問技術,並且允許我們容易地測試我們的控制器類。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章