上篇中我們已經展示資料到View, 但是這些資料都是來自於我們的mock IProductRepository,在我們真正的實現repository之前,我們需要建立一個SQL Server資料庫並添加一些資料。 我們將使用EF架構操作SQL Server資料庫, EF是一個.net ORM架構,ORM架構能讓我們想操作對象執行個體一樣操作資料庫的表、列、行。就像使用正常的C#對象,這麼做需要一點Linq的知識,Linq不是什麼神秘的、高難的東西,相信所有人都能夠在想當短的時間內掌握並使用LInq。 點擊View菜單,開啟伺服器總管,點擊串連到資料庫。你會看到串連對話方塊,設定伺服器名為(localdb)\v11.0,這是一個特殊的名字,表示你要使用本機資料庫的特性。VS2012新添加了一個特性,就是可以使用SQL Server的核心建立一個免管理員的本機資料庫,相關的詳細使用說明,請參見相關文檔,這裡就不細說了。現在,請確保你選擇了windows認證登陸方式,設定資料庫名為SportsStore。如: 點擊確定,然後會出現確認對話方塊,點擊yes,就會建立一個新的資料庫。 我們現在只有一個Product表,右擊表檔案夾,選擇添加新表: 建立新表可以有2種方式,這裡我們使用T-SQL方式,因為它更精準,更方便,建表語句如下:CREATE TABLE Products(
[ProductID] INT NOT NULL PRIMARY KEY IDENTITY,[Name] NVARCHAR(100) NOT NULL,[Description] NVARCHAR(500) NOT NULL,[Category] NVARCHAR(50) NOT NULL,[Price] DECIMAL(16, 2) NOT NULL
)這個表與我們之前定義的Product model 類略有不同,現在點擊更新按鈕,你會看到一個更新的Summary如下:點擊更新資料庫按鈕。表就會被建立出來,我們需要添加些資料到這個表中。
建立Entity Framework Context最新版的EF包含了一個很不錯的特性,叫做code-first,意思是我們能在我們的model中定義一些類,然後從這些類產生資料庫。在此,我不想去談論這種技術的優缺點。相反,我將基於這個code-first,展示給你一個變體,我們將整合我們的model類和一個存在的資料庫,現在我們先安裝EF架構到我們的項目。開啟NuGet工具包管理程式,安裝EF架構,如: 現在,在SportsStore.Domain工程中建立一個檔案夾,叫做Concrete,然後添加一個檔案,命名為EFDbContext,代碼如下: using SportsStore.Domain.Entities;using System.Data.Entity; namespace SportsStore.Domain.Concrete{ public class EFDbContext : DbContext { public DbSet<Product> Products { get; set; } }} 為了使用code-first特性的優勢,我們需要建立一個類,它派生自 System.Data.Entity.DbContext. 這個類會為資料庫中的每個表自動定義一個屬性,並指定表名為屬性名稱,我們現在的屬性名稱是Products,並且型別參數是Product. 我們希望Product model被用作展示 Products表中的行。現在我們要告訴Entity Framework怎樣去串連資料庫,所以我們要添加一個連接字串到
SportsStore.WebUI工程的Web.config檔案中。 <connectionStrings><add name="EFDbContext" connectionString="Data Source=(localdb)\v11.0;InitialCatalog=SportsStore;Integrated Security=True"providerName="System.Data.SqlClient"/></connectionStrings>
建立Product Repository
現在,我們要為實現真是的資料操作添加一個檔案到 Concrete檔案夾中,叫做EFProductRepository。編輯這個檔案,看起來像下面的樣子:using SportsStore.Domain.Abstract;using SportsStore.Domain.Entities;using System.Linq;namespace SportsStore.Domain.Concrete {
public class EFProductRepository : IProductsRepository {
private EFDbContext context = new EFDbContext();
public IQueryable<Product> Products {
get { return context.Products; }
}
}
} 這個repository 類實現了 IProductRepository介面並使用一個EFDbContext 執行個體去資料庫中取資料。你將看到EF是怎麼樣 工作的。現在我們需要編輯NinjectControllerFactory類,用真正的資料替換Mock 對象。using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Web.Routing;using SportsStore.Domain.Abstract;using SportsStore.Domain.Entities;using Moq;using Ninject;
using SportsStore.Domain.Concrete; namespace SportsStore.WebUI.Infrastructure{ public class NinjectControllerFactory: DefaultControllerFactory { private IKernel ninjectKernel; public NinjectControllerFactory() { ninjectKernel = new StandardKernel(); AddBindings(); } protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType); } private void AddBindings() { Mock<IProductsRepository> mock = new Mock<IProductsRepository>(); //mock.Setup(m => m.Products).Returns(new List<Product> { // new Product { Name = "Football", Price = 25 }, // new Product { Name = "Surf board", Price = 179 }, // new Product { Name = "Running shoes", Price = 95 } //}.AsQueryable()); //ninjectKernel.Bind<IProductsRepository>().ToConstant(mock.Object);
ninjectKernel.Bind<IProductsRepository>().To<EFProductRepository>(); } } } 運行你的項目,你將看到如下畫面: 下一篇中,我們將添加更多商品,並應用分頁技術,讓使用者能夠瀏覽我們商品,並可以從一個頁面移動到另一個頁面,我們也將逐步的加入購物車等功能,為您一步一步地展開這個項目,如果您喜歡它,請繼續關注我的續篇!