通過本次教程,你將學會怎樣通過實體框架使用asp.net mvc。你將學會使用實體向導來創建一個ado.net實體數據模型。在本次教程里,我們會創建一個web應用程序來說明怎樣用實體框架顯示,插入,更新和刪除數據庫數據。
Microsoft Entity Framework是一個對象關系映射工具,它能讓你一個創建數據訪問層。避免手動創建數據訪問類帶來的麻煩。
為了演示怎樣使用Entity framework。我們將創建一個簡單的應用程序。在這里我們創建一個movie database應用程序,這個應用程序能讓你顯示和編輯movie數據庫記錄。
本次教程假定你有vs2008 或者visual web developer 2008 和 service pack 1。要使用entity framework你需要service pack 1。你可以從下載Visual Studio 2008 Service Pack 1 或者Visual Web Developer with Service Pack 1。
注意:
ASP.NET MVC 和the Microsoft Entity Framework沒有必然的聯系。除了Entity Framework,你還可以選擇其他的 O/RM工具(如:Microsoft LINQ to SQL, NHibernate 或者SubSonic)。
然后我們要創建一個數據庫,和相應的model (具體內容略)。
注意:
在model文件夾下面的designer.cs文件里,不要寫代碼,容易出錯。如果你想擴展designer.cs里面的entity類的方法,你可以在另一個文件里寫partial classes。
用entity framework 選擇數據記錄
下面的index()動作 通過entity framework返回所有數據庫里的記錄:
Listing 1 – Controllers\HomeController.cs

Code
using System.Linq;
using System.Web.Mvc;
using MovieEntityApp.Models;
namespace MovieEntityApp.Controllers
{
[HandleError]
public class HomeController : Controller
{
MoviesDBEntities _db;
public HomeController()
{
_db = new MoviesDBEntities();
}
public ActionResult Index()
{
ViewData.Model = _db.MovieSet.ToList();
return View();
}
}
}
注意到,在listing 1里有一個構造器,這個構造器用來初始化類里的字段域_db。_db代表了用entityframework生成的實體。_db域是在剛才model里的創建的MoviesDBEntities類的一個實例。
注意:
為了能在controler里使用theMoviesDBEntities類,你必須引入MovieEntityApp.Models namespace命名空間(theMoviesDBEntities所在的空間)。
_db在index()動作里被用來從數據庫的表里返回記錄。tolist()會把movie數據集轉變為一般的movie objects集合(List<movie>).
返回的數據集是用LINQ to entities技術實現的。上面listing 1使用的時LINQ方法語法來返回數據集。如果你喜歡,你也可以使用LINQ查詢語法來實現,下面是兩種語法的相同實現:
ViewData.Model = _db.MovieSet.ToList();
ViewData.Model = (from m in _db.MovieSet select m).ToList();
你覺得那總LINQ語法直觀,就用哪種。它們在執行上沒有什么不同,唯一的不同是形式的不同。
下面的listing 2 用來顯示提取的記錄:
Listing 2 – Views\Home\Index.aspx
<%@ Page Language="C#"
Inherits="System.Web.Mvc.ViewPage<List<MovieEntityApp.Models.Movie>>" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="//www.w3.org/1999/xhtml" >
<head runat="server">
<title>Index</title>
</head>
<body>
<div>
<% foreach (var m in ViewData.Model)
{ %>
Title: <%= m.Title %>
<br />
Director: <%= m.Director %>
<br />
<%= Html.ActionLink("Edit", "Edit", new { id = m.Id })%>
<%= Html.ActionLink("Delete", "Delete", new { id = m.Id })%>
<hr />
<% } %>
<%= Html.ActionLink("Add Movie", "Add") %>
</div>
</body>
</html>
結果如圖:

index view是一個類型化得視圖。index view包含了一個<%@ Page %>指令,這個指令里有Inherits特性,而這個特性指明把model里的property轉變為強類型的一般(泛型)的movie objects集合(List<movie>)。
用 entity framework插入記錄
你可以用entity framework輕松的插入記錄到數據庫里。listing 3 包含了兩個新action動作,你可以用他們來插入記錄到數據庫里:
Listing 3 – Controllers\HomeController.cs (Add methods)
public ActionResult Add()
{
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(FormCollection form)
{
var movieToAdd = new Movie();
// Deserialize (Include white list!)
TryUpdateModel(movieToAdd, new string[] { "Title", "Director" }, form.ToValueProvider());
// Validate
if (String.IsNullOrEmpty(movieToAdd.Title))
ModelState.AddModelError("Title", "Title is required!");
if (String.IsNullOrEmpty(movieToAdd.Director))
ModelState.AddModelError("Director", "Director is required!");
// If valid, save movie to database
if (ModelState.IsValid)
{
_db.AddToMovieSet(movieToAdd);
_db.SaveChanges();
return RedirectToAction("Index");
}
// Otherwise, reshow form
return View(movieToAdd);
}
第一個add()動作只是返回一個試圖。這個視圖包含了一個form(用來添加新記錄)(如圖,finger 8)。當你點擊submint第二個Add(FormCollection form)動作會被調用。
注意到,第二個Add有一個特性AcceptVerbs。這樣只用當執行一個HTTP POST操作時,這個add動作才會被調用。換句話說,就是只用當posting an HTML form時,Add(FormCollection form)動作會被調用.
在第二個Add(FormCollection form)里,通過ASP.NET MVC的 TryUpdateModel()方法,創建一個新的Entity Framework Movie類的實例,TryUpdateModel會收集傳到add()的FormCollection,并把收集到的數據轉變為一個movie實例。
使用Entity Framework,并要用上TryUpdateModel 或者UpdateModel方法時,你需要公開相應的類的屬性。(個屬性的名稱要相同)。
接著,add(FormCollection )方法執行一些簡單的表單認證。這個add動作會認證Title 和Director有值。如果認證失敗,那么認證的錯誤信息會加到ModelState上。
如果沒喲認證錯誤,那么一條新的記錄會被entity framework加到Movies database table里。即執行如下的兩行代碼:
_db.AddToMovieSet(movieToAdd);
_db.SaveChanges();
第一行代碼把新紀錄添加到set of movies中,第二行代碼把所作的更改寫入底層數據庫中(寫入數據庫文件)
Figure 8 – The Add view

用entity framework更新數據庫記錄
你大部分時候都可以想我們上面插入記錄一樣,更新記錄。listing 4 包含了兩個動作Edit(),第一個返回一個html form(這個form是用來編輯記錄的).第二個會嘗試根系記錄。
Listing 4 – Controllers\HomeController.cs (Edit methods)
public ActionResult Edit(int id)
{
// Get movie to update
var movieToUpdate = _db.MovieSet.First(m => m.Id == id);
ViewData.Model = movieToUpdate;
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(FormCollection form)
{
// Get movie to update
var id = Int32.Parse(form["id"]);
var movieToUpdate = _db.MovieSet.First(m => m.Id == id);
// Deserialize (Include white list!)
TryUpdateModel(movieToUpdate, new string[] { "Title", "Director" }, form.ToValueProvider());
// Validate
if (String.IsNullOrEmpty(movieToUpdate.Title))
ModelState.AddModelError("Title", "Title is required!");
if (String.IsNullOrEmpty(movieToUpdate.Director))
ModelState.AddModelError("Director", "Director is required!");
// If valid, save movie to database
if (ModelState.IsValid)
{
_db.SaveChanges();
return RedirectToAction("Index");
}
// Otherwise, reshow form
return View(movieToUpdate);
}
第二個edit()執行時,先從數據庫里獲得一條與id相同的記錄。
接著,TryUpdateModel()方法吧form里的值轉變為一個movie實例。
最后,如果沒有認證錯誤,就保存所作的更改到底層數據庫。
下面是編輯記錄的頁面。注意有一個隱藏域id.
Listing 5 – Views\Home\Edit.aspx
<%@ Page Language="C#"
Inherits="System.Web.Mvc.ViewPage<MovieEntityApp.Models.Movie>" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="//www.w3.org/1999/xhtml" >
<head runat="server">
<title>Edit</title>
<style type="text/css">
.input-validation-error
{
background-color:Yellow;
}
</style>
</head>
<body>
<div>
<h1>Edit Movie</h1>
<form method="post" action="/Home/Edit">
<!-- Include Hidden Id -->
<%= Html.Hidden("id") %>
Title:
<br />
<%= Html.TextBox("title") %>
<br /><br />
Director:
<br />
<%= Html.TextBox("director") %>
<br /><br />
<input type="submit" value="Edit Movie" />
</form>
</div>
</body>
</html>
用Entity Framework刪除記錄
你可以用下面的方法來刪除記錄:
Listing 6 -- \Controllers\HomeController.cs (Delete action)
public ActionResult Delete(int id)
{
// Get movie to delete
var movieToDelete = _db.MovieSet.First(m => m.Id == id);
// Delete
_db.DeleteObject(movieToDelete);
_db.SaveChanges();
// Show Index view
return RedirectToAction("Index");
}
調用DeleteObject()來刪除。
總結
本次教程的目標是展示如何用ASP.NET MVC和the Microsoft Entity Framework來創建數據庫操作應用程序。你學會了如何創建一個可以選擇,插入,更新和刪除記錄的應用程序。
標簽:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園