上篇博客中简单的介绍了MVC的组成以及各部分的作用。这篇博客将介绍MVC+linq+EF框架实现对数据表的查询、删除、修改。
先说一下什么是Linq?
linq是基于关系数据的.net语言集成查询,用于对象形式管理关系数据。在本篇博客的实例中主要使用linq进行查询数据。
再说一下什么是EF?
说到EF不得不先说一下ORM,ORM全称:(Object-Relation Mapping)即对象-关系映射。ORM是将关系数据库中的业务数据用对象的形式表现出来,并通过面向对象的方式将这些对象组织起来,实现系统业务逻辑的过程。ORM做到了关系数据和对象数据之间的映射,ORM可以通过映射关系自动产生SQL语句,ORM在业务逻辑层和数据层之间充当桥梁。
当我们通过应用程序对数据库执行CRUD时,通过EF方式,实际上是对ObjectContext的操作,ObjectContext相当于EF的入口,ObjectContext拿到对应的消息(CRUD)后,通过ORM中的Mapping来将对象O映射成数据库中的关系R。我们通过图来看下Mapping中存储的内容。
对数据表的查询、删除、修改实例
1.使用DBFirst的方式实现对数据库进行映射。
2.在Controllers文件夹新建控制器,利用EF框架和linq写出查询、删除、修改。
/// <summary>
/// 查询数据库中学生姓名
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
//使用linq,查询数据上下文中的学生姓名
List<Models.T_student> list = (from d in db.T_student select d).ToList();
//将集合数据传给视图
ViewData["DataList"] = list;
return View();
}
<span style="white-space:pre"> </span>/// <summary>
/// 根据学生ID删除学生
/// </summary>
/// <param name="id">学生ID</param>
/// <returns></returns>
public ActionResult Del(string id)
{
//创建要删除的实体,并将ID赋值给实体对象
T_student modelDel = new T_student() { studentId = id };
//将实体对象添加到EF管理容器
db.T_student.Attach(modelDel);
//将实体对象包装类标示为删除状态
db.T_student.Remove(modelDel);
//更新数据库
db.SaveChanges();
//更新成功,跳转到Index
return RedirectToAction("Index","MyClass");}
#region 显示要修改的数据
[HttpGet]
/// <summary>
/// 显示要修改的数据
/// </summary>
/// <param name="id">要修改的学生ID</param>
/// <returns></returns>
public ActionResult Modify(string id)
{
//根据学生ID,查询数据库,返回集合中拿到第一个实体对象
T_student ts = (from a in db.T_student where a.studentId == id select a).FirstOrDefault();
//查询课程名称
IEnumerable<SelectListItem> listItem=(from c in db.T_class select c).ToList().Select(c=>new SelectListItem{Value=c.classId.ToString(),Text=c.className});
//查询到的课程名称给Viewbag
ViewBag.classList = listItem;
//使用View,将数据传给视图上名为model的属性
return View(ts);
}
#endregion
#region 保存要修改的数据
[HttpPost]
/// <summary>
/// 保存要修改的数据
/// </summary>
/// <param name="id">要修改的学生ID</param>
/// <returns></returns>
public ActionResult Modify(T_student ts)
{
//将实体对象加入EF对象容器中,并获取包装类对象
DbEntityEntry<T_student> entry=db.Entry<T_student>(ts);
//将包装类设置为unchange
entry.State = System.Data.EntityState.Unchanged;
//设置被改变的属性
entry.Property(a=>a.studentName).IsModified=true;
entry.Property(a => a.classId).IsModified = true;
//提交更新到数据库
db.SaveChanges();
//更新成功,跳转到Index
return RedirectToAction("Index", "MyClass");
}
#endregion
3.添加查询列表视图(Index.cshtml)
@using MyMvcTest.Models
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<style type="text/css">
#tblist {
border:1px solid #0094ff;
width:600px;
margin:10px auto;
border-collapse:collapse;
}
#tblist th, td {
border:1px solid #0094ff;
padding:10px;
}
</style>
</head>
<body>
<table id="tblist">
<tr>
<th>id</th>
<th>姓名</th>
<th>课程ID</th>
<th>编辑</th>
</tr>
<!--变量action方法 设置viewData的集合数据生成html-->
@foreach (T_student student in ViewData["DataList"] as List<T_student>)
{
<tr>
<td>@student.studentId</td>
<td>@student.studentName</td>
<td>@student.classId</td>
<td>
<a href="/MyClass/del/@student.studentId">删除</a>
<a href="/MyClass/modify/@student.studentId">修改</a>
</td>
</tr>
}
</table>
</body>
</html>
4.添加“修改”视图(modify.cshtml)
@model MyMvcTest.Models.T_student
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Modify</title>
<style type="text/css">
#tblist {
border: 1px solid #0094ff;
width: 600px;
margin: 10px auto;
border-collapse: collapse;
}
#tblist th, td {
border: 1px solid #0094ff;
padding: 10px;
}
</style>
</head>
<body>
@using (Html.BeginForm("Modify", "MyClass", FormMethod.Post))
{
<table id="tblist">
<tr>
<td colspan="2">修改:@Html.HiddenFor(a=>a.studentId)</td>
</tr>
<tr>
<td>课程名称</td>
<!--使用HtmlHepler,直接从model获取数据赋值给下拉框-->
<td>@Html.DropDownListFor(a => a.classId, ViewBag.classList as IEnumerable<SelectListItem>)</td>
</tr>
<tr>
<td>学生姓名</td>
<!--使用HtmlHepler,直接从model获取数据赋值给文本框-->
<td>@Html.TextBoxFor(a => a.studentName)</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="确定修改">@Html.ActionLink("返回", "Index", "MyClass")</td>
</tr>
</table>
}
</body>
</html>
通过这个实例的实现,从宏观上了解了mvc和EF结合运用的发挥的优点。也学习到了EF的强大,可以让程序员更注重业务逻辑,而不是注重sql语句的编写。