这篇文章教你如何使用MVC的Microsoft Entity Framework;如何使用Entity 向导创建一个ADO.NET 实体数据模型。这篇文章将演示如何构建一个应用程序通过Entity Framework选择、修改和删除数据库中的数据。
Microsoft Entity Framework是一个ORM工具可以帮你根据数据库表自动生成数据访问层,帮你差事少繁琐的工作量。其实这也不是唯一的方法,其它比如使用Microsoft LINQ to SQL,NHibernate 或者SubSonic创建MVC模型实体类。
首先创建一个电影样例子数据库。如下表格所示范区。
列名 | 数据类型 | 是否为空 | 是否是主键 |
Id | int | False | True |
Title | Nvarchar(100) | False | False |
Director | Nvarchar(100) | False | False |
然后创建ADO.NET实体数据模型。新建一个MVC项目,右键选择Models文件夹,选择添加项,然后选择ADO.NET Entity Data Model。选择模型类别“从数据库生成”然后按照向导建好一个名为ModelTab.edmx的实体数据模型。
在HomeController中添加数据库实例代码如下:
namespace MvcApp.Controllers
{
[HandleError]
public class HomeController : Controller
{
Models.MovieEntities _db;
public HomeController()
{
_db = new MovieEntities();
}
public ActionResult Index()
{
ViewData.Model = _db.MovieTable.ToList();
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult Add()
{
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(FormCollection form)
{
var MovieToAdd = new MvcApp.Models.MovieTable();
TryUpdateModel(MovieToAdd, new string[] { "Id","Title", "Director" }, form.ToValueProvider());
if (string.IsNullOrEmpty(MovieToAdd.Title))
ModelState.AddModelError("Title-", "Title is request!");
if (string.IsNullOrEmpty(MovieToAdd.Director))
ModelState.AddModelError("Director-", "Director is request!");
if (ModelState.IsValid)
{
_db.AddToMovieTable(MovieToAdd);
_db.SaveChanges();
return RedirectToAction("Index");
}
return View(MovieToAdd);
}
public ActionResult Edit(int id)
{
// Get movie to update
var movieToUpdate = _db.MovieTable.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.MovieTable.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);
}
public ActionResult Delete(int id)
{
// Get movie to delete
var movieToDelete = _db.MovieTable.First(m => m.Id == id);
// Delete
_db.DeleteObject(movieToDelete);
_db.SaveChanges();
// Show Index view
return RedirectToAction("Index");
}
public ActionResult About()
{
return View();
}
}
}
最后视图中添加Add.aspx与Edit.aspx
//--index.aspx添加如下列表
<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>
//---add.aspx添加如下
<form method="post" action="/Home/Add">
Id:
<br />
<%= Html.TextBox("id") %>
Title:
<br />
<%= Html.TextBox("title") %>
<br /><br />
Director:
<br />
<%= Html.TextBox("director") %>
<br /><br />
<input type="submit" value="Add Movie" />
</form>
//--Edit.aspx添加如下
<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>
这样就完也通过框架自动生成模型实体类来实现select,insert,update,delete操作。