ASP.NET MVC 音樂市集 – 4. 資料訪問

來源:互聯網
上載者:User
MusicStore 項目的完整配套視頻!

上一次,我們使用了類比的資料從控制器發送到視圖模板。現在,我們開始使用真正的資料庫,在這個教程中,我們將指導如何使用 SQL Server Compact 版的資料庫,它經常被稱為 SQL CE, 來作為資料庫引擎,SQL CE 是一個免費的,嵌入式的,基於檔案的資料庫系統,不需要任何的安裝或者配置,很適合本地的開發使用。

注意:可能需要單獨安裝 SQL Server Compact 4.0 資料庫以及 Entity Framework。在我的機器上,這兩個軟體都是單獨安裝的。

當然,你還可以使用熟悉的 SQL Server 資料庫。

Microsoft SQL Server Compact 4.0

Microsoft SQL Server Compact 4.0 是一種免費的嵌入式資料庫,也就是說,你不需要安裝資料庫系統。軟體開發人員可以使用它來構建 ASP.NET 網站和 Windows 傳統型應用程式。SQL Server Compact 4.0 的優點是:佔用的空間小,支援在應用程式檔案夾中專門部署其二進位檔案,輕鬆地使用 Visual Studio 和 WebMatrix 進行應用程式開發,以及無縫地將架構和資料移轉到 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

不過,你完全可以不使用這個資料庫,還繼續使用原來的 SQL Server, 在我的機器上,我不能直接使用伺服器總管來查看 SQL CE 4 的的資料。如果使用原來的 SQL Server 就不會有這個問題了。

ADO.NET Entity Framework 4.1

EF 4.1有哪些新玩新兒?

1. 首先當然是DbContext API,它是基於以前版本中的ObjectContext和其他一些類型抽象出的一個簡單的API,針對常用開發情境和編程模式進行了最佳化。DbContext可以被於Database First, Model First, Code First三種開發模式。

2. Code First是基於Entity Framework的新的開發模式,原先只有Database First和Model First兩種。Code First顧名思義,就是先用C#/VB.NET的類定義好你的領域模型,然後用這些類映射到現有的資料庫或者產生新的資料庫結構。Code First同樣支援通過Data Annotations或fluent API進行定製化配置。

這裡的資料訪問就使用 Code First 完成,它會使你的資料訪問驚人地簡單。

關於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 

使用 Entity Framework Code-First 進行資料訪問

我們將使用包含在 ASP.NET MVC3 中的 Entity Framework (EF) 支援進行查詢和更新資料庫中的資料。EF 是一個靈活的進行資料訪問的對象關係映射 API,允許開發人員使用物件導向的方式對資料庫中的資料進行查詢和更新。

Entity Framework 4 支援一種稱為代碼優先的開發模式,代碼有限允許你通過編寫簡單的類來建立模型對象(也被稱為 POCO, 簡單的,老的 CLR 對象),然後通過類來建立資料。

注意,需要在你的項目中引用程式集 EntityFramework,在你安裝 Entity Framework 的檔案夾中可以找到這個程式集。

修改我們的模型類

我們將延後資料庫的建立工作,在完成這個任務之前,我們先修改我們得模型類,增加我們需要的內容。

增加藝術家 Artist 類

我們的專輯將要關聯到藝術家,所以,我們需要增加一個簡單的類來描述藝術家,增加一個新的名為 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<Album> Albums { get; set; }
}
}

 

增加 App_Data 檔案夾

這一步並不必要,如果使用 SQL CE4,可以用來儲存資料庫檔案,如果使用 SQL Server 則不一定需要。

我們在項目中增加 App_Data 檔案夾用來儲存資料庫檔案,App_Data 是一個 ASP.NET 中特殊的檔案夾,已經被網站對其中資料地訪問進行了安全限制,從項目的菜單中,選擇增加 ASP.NET 檔案夾,然後,選擇 App_Data.

在 Web.config 中建立資料庫連接串

我們需要在網站的設定檔中增加一些行,以便 Entity Framework 知道如何串連到我們的資料庫,雙擊 Web.config 檔案。

卷到檔案的最後,然後增加一個 <connectionStrings> 的配置節,如何所示:

<connectionStrings>
<add name="MusicStoreEntities"
connectionString="Data Source=|DataDirectory|MvcMusicStore.sdf"
providerName="System.Data.SqlServerCe.4.0"/>
</connectionStrings>

注意,這裡資料庫連接串的名稱很重要,以後使用 EF Code-First 的時候,通過它來找到資料庫,這裡的連結串種使用了 Data Source=|DataDirectory|MvcMusicStore.sdf,這裡的 DataDirectory 指的就是項目中的 App_Data 檔案夾夾。

如果使用 SQL Server, 可以使用如下的連結串。注意 providerName 也要替換成 SQLServer 使用的提供器。

<!-- 資料庫連接串的配置 -->
<connectionStrings>
<add name="MusicStoreEntities"
connectionString="server=.\sqlexpress;database=musicstore;integrated security=true;"
providerName="System.Data.SqlClient"/>
</connectionStrings>

 

增加上下文類

在模型檔案夾上右鍵點擊,然後,增加一個新的名為 MusicStoreEntities.cs 的檔案。 需要注意的是,這個類的名稱必須與資料庫連接串的名稱一致。

這個類將反映 Entity Framework 資料庫的上下文,用來處理建立,讀取,更新和刪除的操作,代碼如下所示:

using System.Data.Entity;

namespace MvcMusicStore.Models
{
public class MusicStoreEntities:
DbContext
{
public DbSet<Album> Albums { get; set; }
public DbSet<Genre> Genres { get; set; }


public DbSet<Artist> Artists { get; set; }
}
}

 

注意,這裡使用了 System.Data.Entity 命名空間。記得要 using 一下。

不需要其他的配置,特定的介面等等,通過擴充 DbContext 基類,我們得 MusicStoreEntities 類就可以處理我們對資料庫的操作了,現在,我們就開始,先為我們的類增加一些屬性來從資料庫擷取額外的資訊。

增加我們的商店分類資料

對於 Code First 來說,我們首先定義模型,然後通過模型來建立資料庫,甚至也不需要寫 Insert 語句,我們可以通過標準的 C# 代碼來建立表中的記錄。

我們先通過一些種子資料通過 Entity Framework 為新建立的資料庫增加一些資料。先建立我們的商店分類,這需要通過一個 Genres 的列表完成,還有專輯。在 MvcMusicStore-Asset.zip 檔案中,已經包含了用來簡單地建立資料的檔案,有一個儲存在 Code 檔案夾中的類來完成。

在 Code 中的 Models 檔案夾中,找到 SampleData.cs 檔案,將它加入到 Models 檔案夾中,如下所示。

 現在,我們需要增加一些代碼來告訴 Entity Framework 關於 SampleData 類的事情。雙擊 Global.asax 檔案,開啟它,在 Application_Start 方法中,增加如下的行。

// 一般用來進行網站的初始化
protected void Application_Start()
{
System.Data.Entity.Database.SetInitializer(new MvcMusicStore.Models.SampleData());

AreaRegistration.RegisterAllAreas();

RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}

這個方法用來初始化資料庫,然後填充一些資料。

這樣,我們就完成了配置 Entity Framework 的工作。

查詢資料庫

現在,我們更新一下我們的 StoreController 以便取代以前類比的資料,通過調用我們的資料庫來查詢實際資料。我們先在 StoreController 中定義一個欄位來訪問我們的 MusicStoreEneities 類的對象執行個體,它命名為 storeDB。

using MvcMusicStore.Models;

namespace MvcMusicStore.Controllers
{
public class StoreController : Controller
{
MusicStoreEntities storeDB = new MusicStoreEntities();

 

更新 Index Action 查詢資料庫

MusicStoreEntities 類通過 Entity Framework 提供了資料庫中資料表的集合,更新一下 StoreController 的 Index Action 方法來擷取全部的分類資料。我們原來使用硬式編碼資料,現在,我們可以使用 Entity Framework 的 Generes 集合來取代它了。

對於 EF 的使用,我建議你瞭解一下 Repository 模式。

//
// GET: /Store/
public ActionResult Index()
{
var genres = storeDB.Genres.ToList();

return this.View( genres );
}

 

對於視圖模板不需要任何修改,我們仍然返回同樣的 StoreIndexViewModel 。

運行程式,訪問 /Store 地址的時候,我們現在可以看到資料庫中分類的列表。

  

使用資料庫中的資料更新瀏覽和明細頁面

當在首頁通過 /Store/Browse?genre=[some-genre] 連結訪問 Browse 這個 Action 的時候,我們需要通過流派的名稱來擷取相應的專輯,對於我們的音樂店來說,每個流派的名稱是唯一的,可以通過 LINQ 中的 Single 擴充方法來擷取查詢結果中的唯一的流派對象。

var example = storeDB.Genres.Single(g => g.Name == “Disco”);

 

Single 方法使用一個 Lambda 運算式作為參數,表示我們希望擷取匹配指定值的單個流派對象,在上面的例子中,我們將會獲得名為  Disco 的流派對象。

通過 EF ,在獲得流派對象的同時,我們還可以擷取流派相關的對象,例如屬於這個流派的專輯集合,我們可以提前擷取相關的專輯資訊,這就需要我們修改一下上面的查詢,包含專輯資訊。通過 Include 方法可以指定我們希望擷取的相關資訊,這種方式非常有效,這樣,我們就可以在一次資料訪問中,既可以擷取流派對象,也可以同時擷取相關的專輯對象。

這樣更新之後,我們的 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 視圖來顯示相應的專輯,開啟視圖模板,增加一個列表。

@model MvcMusicStore.Models.Genre 
@{
ViewBag.Title = "Browse";
}
<h2>
Browsing Genre: @Model.Name</h2>
<ul>
@foreach (var album in Model.Albums)
{
<li>
@album.Title
</li>
}
</ul>

 

運行程式,瀏覽 /Store/Browse?genre=Jazz,現在就可以看到儲存在資料庫中的的專輯資料了。

同樣,我們還可以修改一下 Details ,通過傳遞的參數來擷取專輯對象。修改後的方法如下所示。

// /Store/Details/5
public ActionResult Details(int id)
{
var album = storeDB.Albums.Find(id);
return View(album);
}

 

運行程式,訪問 /Store/Details/1,應該可以看到下面的內容。

我們更新一下 Browse 視圖,提供連結到明細頁面的超級連結,這裡,我們使用 ActionLink 方法,修改後的視圖如下所示。

再次瀏覽 Browse 的時候,每個專輯應該已經成為了一個連結,:

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.