解析ASP.NET Mvc開發之查詢資料例項
對於.NET平臺上開發WebForm專案,程式設計師操作資料的方法主要是通過使用ADO.NET。而我們MVC操作資料庫呢? 與ADO.NET相比又有怎樣的優勢呢?
一,大家都在談的EF到底是什麼?
EF ,全稱Entity FramWork。就是微軟以ADO.NET為基礎發展的所謂ORM
簡單的來說就是根據實體物件操作資料表中資料的一種面向物件的操作框架,具體的底層也是呼叫ADO.NET。具體概念可以參考維基百科(點選我轉到)。
下面我們就來演示怎麼使用EF來操作資料庫:
點選這裡可以下載我建立資料庫的指令碼檔案,當然你也可以是使用自己的資料庫。
在資料庫關係圖中,表之間的關係是這樣的:
1)怎麼建立實體物件模型檔案
①建立基於ADO.NET的實體資料模型
我這裡在我的Models資料夾(可以在任意地方哦)上“右鍵”→“新建項”,然後點選進入,在左側的模板中,選擇"資料",在右側就會看到“ADO.NET實體資料模型”的選項,如下圖:
②點選建立,進入”實體資料模型嚮導“,這裡我們可以選擇,要怎樣建立實體資料模型
注意:這裡你可以分別選擇一種模型,在下邊的框中看到這兩種模型的區別,這裡不多做解釋;
因為我們是從已經有的資料庫建立實體模型,所以選擇第一種”從資料庫生成“
③點選下一步,進入連線資料庫的嚮導,通過新建連線,可以連線到自己的SQL Server伺服器,然後選擇我們所要連線的資料庫,同時會生成實體連線字串,如下圖:
④點選下一步,選擇”實體框架版本“
⑤下一步,選擇需要在模型中包含的資料庫物件,選擇”確定所生成物件的單複數形式“,其它保持預設,點選完成。如下圖:
這時會在我們的Models資料夾下邊生成一個edmx檔案,同時EF框架的設計器幫我們生成了根據資料表關係生成的實體類的關係圖
注意:這裡是不是發現這個表跟我們在資料庫關係圖中看到的圖有點相似啊?是的,很相似,但是所表達的意義是不一樣的。資料庫檢視所展示的是資料表之間的關係,而這裡展示的EF幫我們根據資料表關係生成的實體類的關係;
2)生成的edmx檔案到底是什麼?
edmx檔案的程式碼樹如下:
①怎麼會是XML檔案?
我們通過”右鍵“→”開啟方式“→在”XML編輯器“中開啟,可以發現這個edmx檔案是一個標準的XML檔案,其中主要有三大塊,描述的就是我們的實體物件和資料庫對映的關係。如下圖:
②.tt檔案下怎麼生成了.cs檔案?
資料庫上下文類。
在程式碼樹中我們很容易的發現,在.tt檔案下邊生成了.cs類檔案。”OumindBlog.Context.cs“檔案的程式碼和作用如下:
//繼承自DbContext類,
//資料上下文類,用於操作資料庫。負責維護實體狀態,以及根據實體物件包裝類的狀態屬性,生成不同的SQL語句執行
public partial class OumindBlogEntities : DbContext
{
public OumindBlogEntities()
: base("name=OumindBlogEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public DbSet<BlogArticle> BlogArticles { get; set; }
public DbSet<BlogArticleCate> BlogArticleCates { get; set; }
public DbSet<BlogUser> BlogUsers { get; set; }
public DbSet<Enumeration> Enumerations { get; set; }
}
實體類。
而另一個.tt檔案生成的類是做什麼用呢?我們開啟一個看程式碼:
//EF按照實體模型生成的實體類
public partial class BlogArticleCate
{
public BlogArticleCate()
{
this.BlogArticles = new HashSet<BlogArticle>();
}
public int Id { get; set; }
public int Author { get; set; }
public string Name { get; set; }
public string Remark { get; set; }
public int Statu { get; set; }
public bool IsDel { get; set; }
public System.DateTime Addtime { get; set; }
//生成的外來鍵屬性
public virtual ICollection<BlogArticle> BlogArticles { get; set; }
public virtual BlogUser BlogUser { get; set; }
}
很容易的發現這些欄位和我們資料庫中的欄位是對應的,這就是EF按照實體模型生成的實體類,而且在還成了外來鍵屬性。
---------------------------------------------------預備工作到此結束--------------------------------------------------
二,使用EF操作資料庫
在上面”OumindBlog.Context.cs“中生成繼承DbContext的OumindBlogEntities 的類,來維護實體狀態,並且操作資料庫,所以我們首先要建立該類的物件,並且操作資料的程式碼如下:
//建立資料庫上下文類的物件
OumindBlogEntities db = new OumindBlogEntities();
#region 查詢文章列表+ActionResult Article()
/// <summary>
/// 查詢文章列表
/// </summary>
/// <returns></returns>
public ActionResult Article()
{
//通過db物件獲取文章列表
db.BlogArticles.Where(p => p.AIsDel == false);//使用Lamabda表示式來獲取為被刪除的文章
//使用Lamabda表示式來獲取資料
//返回一個List<T>的物件來儲存文章列表
List < Models.BlogArticle > list= db.BlogArticles.Where(p => p.AIsDel == false).ToList();
//也可以使用Linq來獲取資料
List<Models.BlogArticle> list1 = (from p in db.BlogArticles where p.AIsDel == false select p).ToList();
//使用ViewData來傳遞list物件
ViewData["DataList"] = list;
return View();
}
#endregion
接著我們為Article建立檢視,並且接收資料,
因為我們需要使用BlogArticle物件來顯示資料,所以應該首先匯入名稱空間
<!------------首先匯入名稱空間------------->>
@using MvcApplication1.Models;
然後顯示資料的程式碼是:
<!------------獲取資料並顯示html------------->>
<div>
<table id="tbList">
<tr>
<th>id</th>
<th>標題</th>
<th>分類</th>
<th>狀態</th>
<th>時間</th>
<th>操作</th>
</tr>
<!--遍歷 Action方法 設定給 ViewData 的集合資料,生成HTML程式碼-->
@foreach (BlogArticle a in ViewData["DataList"] as List<BlogArticle>)
{
<tr>
<td>@a.AId</td>
<td>@a.ATitle</td>
<td>@a.BlogArticleCate.Name</td>
<td>@a.Enumeration.e_cname</td>
<td>@a.AAddtime</td>
</tr>
}
</table>
</div>
執行的結果如下:
三,總結
1)EF框架根據我們的資料庫中資料模型生成實體資料模型;
2)實體資料模型為一個edmx檔案,且該檔案為一個標準的XML檔案,主要描述實體物件和資料庫對映關係;
3).tt檔案為我們生成了資料庫上下文類(用於操作資料庫)和實體類(表示實體物件和外來鍵屬性關係);
4)實體物件可以使用Lamabda表示式或者Linq來查詢需要的資料,並且使用一個List物件來儲存資料;
5)易於理解程式碼,在實際的操作中不需要像ADO.net一樣創造大量的資料庫訪問層;
畢業實習交流群:221376964。你也可以關注我的新浪微博進行交流。