上一次,我們使用了模擬的數(shù)據(jù)從控制器發(fā)送到視圖模板?,F(xiàn)在,我們開始使用真正的數(shù)據(jù)庫,在這個教程中,我們將指導(dǎo)如何使用 SQL Server Compact 版的數(shù)據(jù)庫,它經(jīng)常被稱為 SQL CE, 來作為數(shù)據(jù)庫引擎,SQL CE 是一個免費的,嵌入式的,基于文件的數(shù)據(jù)庫系統(tǒng),不需要任何的安裝或者配置,很適合本地的開發(fā)使用。
站在用戶的角度思考問題,與客戶深入溝通,找到龍亭網(wǎng)站設(shè)計與龍亭網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋龍亭地區(qū)。注意:可能需要單獨安裝 SQL Server Compact 4.0 數(shù)據(jù)庫以及 Entity Framework。在我的機器上,這兩個軟件都是單獨安裝的。
當(dāng)然,你還可以使用熟悉的 SQL Server 數(shù)據(jù)庫。
Microsoft SQL Server Compact 4.0 是一種免費的嵌入式數(shù)據(jù)庫,也就是說,你不需要安裝數(shù)據(jù)庫系統(tǒng)。軟件開發(fā)人員可以使用它來構(gòu)建 ASP.NET 網(wǎng)站和 Windows 桌面應(yīng)用程序。SQL Server Compact 4.0 的優(yōu)點是:占用的空間小,支持在應(yīng)用程序文件夾中專門部署其二進制文件,輕松地使用 Visual Studio 和 WebMatrix 進行應(yīng)用程序開發(fā),以及無縫地將架構(gòu)和數(shù)據(jù)遷移到 SQL Server。
SQL Server Compact 4.0 安裝文件的下載地址:http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=033cfb76-5382-44fb-bc7e-b3c8174832e2&displaylang=zh-cn
不過,你完全可以不使用這個數(shù)據(jù)庫,還繼續(xù)使用原來的 SQL Server, 在我的機器上,我不能直接使用服務(wù)器資源管理器來查看 SQL CE 4 的的數(shù)據(jù)。如果使用原來的 SQL Server 就不會有這個問題了。
EF 4.1有哪些新玩新兒?
1. 首先當(dāng)然是DbContext API,它是基于以前版本中的ObjectContext和其他一些類型抽象出的一個簡單的API,針對常用開發(fā)場景和編程模式進行了優(yōu)化。DbContext可以被于Database First, Model First, Code First三種開發(fā)模式。
2. Code First是基于Entity Framework的新的開發(fā)模式,原先只有Database First和Model First兩種。Code First顧名思義,就是先用C#/VB.NET的類定義好你的領(lǐng)域模型,然后用這些類映射到現(xiàn)有的數(shù)據(jù)庫或者產(chǎn)生新的數(shù)據(jù)庫結(jié)構(gòu)。Code First同樣支持通過Data Annotations或fluent API進行定制化配置。
這里的數(shù)據(jù)訪問就使用 Code First 完成,它會使你的數(shù)據(jù)訪問驚人地簡單。
關(guān)于ADO.NET Entity Framework 4.1,我以前翻譯了一個系列,地址: http://www.cnblogs.com/haogj/archive/2011/05/06/2038965.html
ADO.NET Entity Framework 4.1 安裝文件下載地址:http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=8363
我們將使用包含在 ASP.NET MVC3 中的 Entity Framework (EF) 支持進行查詢和更新數(shù)據(jù)庫中的數(shù)據(jù)。EF 是一個靈活的進行數(shù)據(jù)訪問的對象關(guān)系映射 API,允許開發(fā)人員使用面向?qū)ο蟮姆绞綄?shù)據(jù)庫中的數(shù)據(jù)進行查詢和更新。
Entity Framework 4 支持一種稱為代碼優(yōu)先的開發(fā)模式,代碼有限允許你通過編寫簡單的類來創(chuàng)建模型對象(也被稱為 POCO, 簡單的,老的 CLR 對象),然后通過類來創(chuàng)建數(shù)據(jù)。
注意,需要在你的項目中引用程序集 EntityFramework,在你安裝 Entity Framework 的文件夾中可以找到這個程序集。
我們將延后數(shù)據(jù)庫的創(chuàng)建工作,在完成這個任務(wù)之前,我們先修改我們得模型類,增加我們需要的內(nèi)容。
我們的專輯將要關(guān)聯(lián)到藝術(shù)家,所以,我們需要增加一個簡單的類來描述藝術(shù)家,增加一個新的名為 Artist 的類。
namespace MvcMusicStore.Models
{
public class Artist
{
public int ArtistId { get; set; }
public string Name { get; set; }
}
}
namespace MvcMusicStore.Models
{
public class Album
{
public int AlbumId { get; set; }
public int GenreId { get; set; }
public int ArtistId { get; set; }
public string Title { get; set; }
public decimal Price { get; set; }
public string AlbumArtUrl { get; set; }
public Genre Genre { get; set; }
public Artist Artist { get; set; }
}
}
然后更新 Genre 類
namespace MvcMusicStore.Models
{
public class Genre
{
public int GenreId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public List Albums { get; set; }
}
}
這一步并不必要,如果使用 SQL CE4,可以用來保存數(shù)據(jù)庫文件,如果使用 SQL Server 則不一定需要。
我們在項目中增加 App_Data 文件夾用來保存數(shù)據(jù)庫文件,App_Data 是一個 ASP.NET 中特殊的文件夾,已經(jīng)被網(wǎng)站對其中數(shù)據(jù)地訪問進行了安全限制,從項目的菜單中,選擇增加 ASP.NET 文件夾,然后,選擇 App_Data.
我們需要在網(wǎng)站的配置文件中增加一些行,以便 Entity Framework 知道如何連接到我們的數(shù)據(jù)庫,雙擊 Web.config 文件。
卷到文件的最后,然后增加一個
connectionString="Data Source=|DataDirectory|MvcMusicStore.sdf"
providerName="System.Data.SqlServerCe.4.0"/>
注意,這里數(shù)據(jù)庫連接串的名稱很重要,以后使用 EF Code-First 的時候,通過它來找到數(shù)據(jù)庫,這里的鏈接串種使用了 Data Source=|DataDirectory|MvcMusicStore.sdf,這里的 DataDirectory 指的就是項目中的 App_Data 文件夾夾。
如果使用 SQL Server, 可以使用如下的鏈接串。注意 providerName 也要替換成 SQLServer 使用的提供器。
connectionString="server=.sqlexpress;database=musicstore;integrated security=true;"
providerName="System.Data.SqlClient"/>
在模型文件夾上右鍵點擊,然后,增加一個新的名為 MusicStoreEntities.cs 的文件。 需要注意的是,這個類的名稱必須與數(shù)據(jù)庫連接串的名稱一致。
這個類將反映 Entity Framework 數(shù)據(jù)庫的上下文,用來處理創(chuàng)建,讀取,更新和刪除的操作,代碼如下所示:
using System.Data.Entity;
namespace MvcMusicStore.Models
{
public class MusicStoreEntities:
DbContext
{
public DbSet Albums { get; set; }
public DbSet Genres { get; set; }
public DbSet Artists { get; set; }
}
}
注意,這里使用了 System.Data.Entity 命名空間。記得要 using 一下。
不需要其他的配置,特定的接口等等,通過擴展 DbContext 基類,我們得 MusicStoreEntities 類就可以處理我們對數(shù)據(jù)庫的操作了,現(xiàn)在,我們就開始,先為我們的類增加一些屬性來從數(shù)據(jù)庫獲取額外的信息。
對于 Code First 來說,我們首先定義模型,然后通過模型來創(chuàng)建數(shù)據(jù)庫,甚至也不需要寫 Insert 語句,我們可以通過標(biāo)準(zhǔn)的 C# 代碼來創(chuàng)建表中的記錄。
我們先通過一些種子數(shù)據(jù)通過 Entity Framework 為新創(chuàng)建的數(shù)據(jù)庫增加一些數(shù)據(jù)。先創(chuàng)建我們的商店分類,這需要通過一個 Genres 的列表完成,還有專輯。在 MvcMusicStore-Asset.zip 文件中,已經(jīng)包含了用來簡單地創(chuàng)建數(shù)據(jù)的文件,有一個保存在 Code 文件夾中的類來完成。
在 Code 中的 Models 文件夾中,找到 SampleData.cs 文件,將它加入到 Models 文件夾中,如下所示。
現(xiàn)在,我們需要增加一些代碼來告訴 Entity Framework 關(guān)于 SampleData 類的事情。雙擊 Global.asax 文件,打開它,在 Application_Start 方法中,增加如下的行。
// 一般用來進行網(wǎng)站的初始化
protected void Application_Start()
{
System.Data.Entity.Database.SetInitializer(new MvcMusicStore.Models.SampleData());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
這個方法用來初始化數(shù)據(jù)庫,然后填充一些數(shù)據(jù)。
這樣,我們就完成了配置 Entity Framework 的工作。
現(xiàn)在,我們更新一下我們的 StoreController 以便取代以前模擬的數(shù)據(jù),通過調(diào)用我們的數(shù)據(jù)庫來查詢實際數(shù)據(jù)。我們先在 StoreController 中定義一個字段來訪問我們的 MusicStoreEneities 類的對象實例,它命名為 storeDB。
using MvcMusicStore.Models;
namespace MvcMusicStore.Controllers
{
public class StoreController : Controller
{
MusicStoreEntities storeDB = new MusicStoreEntities();
MusicStoreEntities 類通過 Entity Framework 提供了數(shù)據(jù)庫中數(shù)據(jù)表的集合,更新一下 StoreController 的 Index Action 方法來獲取全部的分類數(shù)據(jù)。我們原來使用硬編碼的數(shù)據(jù),現(xiàn)在,我們可以使用 Entity Framework 的 Generes 集合來取代它了。
對于 EF 的使用,我建議你了解一下 Repository 模式。
//
// GET: /Store/
public ActionResult Index()
{
var genres = storeDB.Genres.ToList();
return this.View( genres );
}
對于視圖模板不需要任何修改,我們?nèi)匀环祷赝瑯拥?StoreIndexViewModel 。
運行程序,訪問 /Store 地址的時候,我們現(xiàn)在可以看到數(shù)據(jù)庫中分類的列表。
當(dāng)在首頁通過 /Store/Browse?genre=[some-genre]鏈接訪問 Browse 這個 Action 的時候,我們需要通過流派的名稱來獲取相應(yīng)的專輯,對于我們的音樂店來說,每個流派的名稱是唯一的,可以通過 LINQ 中的 Single 擴展方法來獲取查詢結(jié)果中的唯一的流派對象。
var example = storeDB.Genres.Single(g => g.Name == “Disco”);
Single 方法使用一個 Lambda 表達式作為參數(shù),表示我們希望獲取匹配指定值的單個流派對象,在上面的例子中,我們將會獲得名為 Disco 的流派對象。
通過 EF ,在獲得流派對象的同時,我們還可以獲取流派相關(guān)的對象,例如屬于這個流派的專輯集合,我們可以提前獲取相關(guān)的專輯信息,這就需要我們修改一下上面的查詢,包含專輯信息。通過 Include 方法可以指定我們希望獲取的相關(guān)信息,這種方式非常有效,這樣,我們就可以在一次數(shù)據(jù)訪問中,既可以獲取流派對象,也可以同時獲取相關(guān)的專輯對象。
這樣更新之后,我們的 Action 方法將會成為下面的樣子。
// /Store/Browse?genre=DISCO
public ActionResult Browse( string genre )
{
var genreModel = storeDB.Genres.Include("Albums").Single(g => g.Name == genre);
return this.View(genreModel);
}
注意,在流派 Genre 的屬性中有一個名為 Albums 的集合屬性。
然后,我們可以更新一下 Store 的 Browse 視圖來顯示相應(yīng)的專輯,打開視圖模板,增加一個列表。
@model MvcMusicStore.Models.Genre
@{
ViewBag.Title = "Browse";
}
Browsing Genre: @Model.Name
@foreach (var album in Model.Albums)
{
@album.Title
}
運行程序,瀏覽 /Store/Browse?genre=Jazz,現(xiàn)在就可以看到保存在數(shù)據(jù)庫中的的專輯數(shù)據(jù)了。
同樣,我們還可以修改一下 Details ,通過傳遞的參數(shù)來獲取專輯對象。修改后的方法如下所示。
// /Store/Details/5
public ActionResult Details(int id)
{
var album = storeDB.Albums.Find(id);
return View(album);
}
運行程序,訪問 /Store/Details/1,應(yīng)該可以看到下面的內(nèi)容。
我們更新一下 Browse 視圖,提供鏈接到明細頁面的超級鏈接,這里,我們使用 ActionLink 方法,修改后的視圖如下所示。
再次瀏覽 Browse 的時候,每個專輯應(yīng)該已經(jīng)成為了一個鏈接,如圖所示: