MVC+EF6教程二:EF基本的CRUD
上篇文章主要讲了如何配置EF, 我们回顾下主要过程:
创建Data Model》创建Database Context》创建databaseInitializer》配置entityFramework的context配置节。
对这个过程还有疑问的可以去上篇再看一下。
本次我们就主要讲解 (1) EF基本的CRUD (2) 涉及到的常用HtmlHelper
文章提纲
概述 & 要点
理论基础
详细步骤
总结
概述 & 要点
下面是本文要点,正文部分会有详细介绍。
-
EF数据模型的CRUD
-
常用的HtmlHelper
-
Repository Pattern
EF数据查询
先讲使用频率最高的查询部分。
EF数据查询用LINQ实现(LINQ to Entities),通常有表达式和函数式两种方式。建议用函数式方式,比较简单。
假设我们已经定义好了context
private AccountContext db = new AccountContext();
1.[基本查询] 查询所有的SysUser
var users = from u in db.SysUsers
select u; //表达式方式
users = db.SysUsers; //函数式方式
2.[条件查询] 加入查询条件
users = from u in db.SysUsers
where u.UserName == "Tom"
select u; //表达式方式
users = db.SysUsers.Where(u => u.UserName == "Tom"); //函数式方式
NOTE 注意这边等号是C#写法 : " == "
3.[排序和分页查询]
users = (from u in db.SysUsers
orderby u.UserName
select u).Skip(0).Take(5); //表达式方式
users = db.SysUsers.OrderBy(u => u.UserName).Skip(0).Take(5); //函数式方式
NOTE 只有排序了才能分页
4.[聚合查询]
//查user总数
var num = db.SysUsers.Count();
//查最小ID
minId = db.SysUsers.Min(u => u.ID);
NOTE 聚合查询只能通过函数式查询
5.[连接查询]
var users = from ur in db. SysUserRoles
join u in db. SysUsers
on ur.SysUserID equals u.ID
select ur;
详细步骤
-
查询用户及相应角色的功能
-
修改用户
-
增加用户和删除用户
使用Repository Pattern模式,完成对数据库表的CRUD操作。具体的做法:
先定义Interface, 通过定义接口确定数据访问类的功能需求, 接着实现该接口。
以对SysUser这张表的操作为例。
先建一个文件夹 Repositories, 在文件夹中新建一个接口ISysUserRepository
public interface ISysUserRepository { // 查询所有用户 IQueryable<SysUser> SelectAll(); // 根据用户名称查询用户 SysUser SelectByName(string userName); // 根据用户ID查询用户 SysUser SelectByID(int id); // 添加用户 void Add(SysUser user); // 根据用户ID删除用户 bool Delete(int id); }
同样文件夹下新建类,继承接口,实现功能
public class SysUserRepository : ISysUserRepository { protected AccountContext db = new AccountContext(); /// <summary> /// 添加用户 /// </summary> /// <param name="user"></param> public void Add(SysUser user) { db.SysUsers.Add(user); db.SaveChanges(); } /// <summary> /// 删除用户 /// </summary> /// <param name="id"></param> /// <returns></returns> public bool Delete(int id) { SysUser user = db.SysUsers.Find(id); if (user != null) { db.SysUsers.Remove(user); db.SaveChanges(); return true; } else { return false; } } /// <summary> /// 查询所有用户 /// </summary> /// <returns></returns> public IQueryable<SysUser> SelectAll() { return db.SysUsers; } /// <summary> /// 根据用户名查询用户 /// </summary> /// <param name="userName">用户名称</param> /// <returns></returns> public SysUser SelectByName(string userName) { SysUser user = db.SysUsers.FirstOrDefault(u => u.UserName == userName); return user; } /// <summary> /// 根据用户ID查询用户 /// </summary> /// <param name="id">用户ID</param> /// <returns></returns> public SysUser SelectByID(int id) { SysUser user = db.SysUsers.FirstOrDefault(u => u.ID == id); return user; } }
1.查询用户及相应的角色
将所有用户作为参数传给View
public ActionResult Index() {
// 将model作为参数传过去 return View(db.SysUsers); }
public ActionResult Details(int id) { SysUser user = db.SysUsers.Find(id); return View(user); }
通过IsysUserRepository接口对象引用SysUserRepository类的实例来调用:ISysUserRepository repository = new SysUserRepository();
增加用户、更新用户和删除用户的Control代码如下(涉及到数据更新的地方都有两个同名的方法重载,一个用来显示[HttpGet],一个用来数据更新[HttpPost])
public ActionResult Create() { return View(); } [HttpPost] public ActionResult Create(SysUser user) { repository.Add(user); return RedirectToAction("Index"); }
public ActionResult Edit(int id) { SysUser user = repository.SelectByID(id); return View(user); } [HttpPost] public ActionResult Edit(SysUser user) { db.Entry(user).State = System.Data.Entity.EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index"); }
public ActionResult Delete(int id) { SysUser user = repository.SelectByID(id); return View(user); } [HttpPost, ActionName("Delete")] public ActionResult DeleteConfirmed(int id) { bool flag = repository.Delete(id); return RedirectToAction("Index"); }
用户详情View(Details.cshtml)
<body> @model MvcWebDemo.Models.SysUser <dl> <dt> @Html.DisplayNameFor(model => model.UserName) </dt> <dd> @Html.DisplayFor(model => model.UserName) </dd> <dt> @Html.DisplayNameFor(model => model.Email) </dt> <dd> @Html.DisplayFor(model => model.Email) </dd> <dt> @Html.DisplayNameFor(model=>model.SysUserRoles) </dt> <dd> <table> <tr> <th>RoleName</th> <th>RoleDesc</th> </tr> @foreach (var item in Model.SysUserRoles) { <tr> <td>@Html.DisplayFor(modelItem=>item.SysRole.RoleName)</td> <td>@Html.DisplayFor(modelItem => item.SysRole.RoleDesc)</td> </tr> } </table> </dd> </dl> </body>
增加用户View(Create.cshtml)
<body> @model MvcWebDemo.Models.SysUser <div> @using (Html.BeginForm()) { <div> @Html.LabelFor(model => model.UserName) @Html.EditorFor(model => model.UserName) </div> <div> @Html.LabelFor(model => model.Email) @Html.EditorFor(model => model.Email) </div> <div> @Html.LabelFor(model => model.Password) @Html.PasswordFor(model => model.Password) </div> <div> <input type="submit" value="Create" /> </div> } <div>@Html.ActionLink("Back to List", "Index")</div> </div> </body>
更新用户View(Edit.cshtml)
<body> @model MvcWebDemo.Models.SysUser <div> <h2>Edit</h2> @*BeginForm 生成一个表单*@ @using (Html.BeginForm()) { @Html.HiddenFor(model => model.ID) <div> @Html.LabelFor(model => model.UserName) @Html.EditorFor(model => model.UserName) </div> <div> @Html.LabelFor(model => model.Email) @Html.EditorFor(model => model.Email) </div> <div> @Html.LabelFor(model => model.Password) @Html.PasswordFor(model => model.Password) </div> <div> <input type="submit" value="Save" /> </div> } <div>@Html.ActionLink("Back to List", "Index")</div> </div> </body>
删除用户View(Delete.cshtml)
<body> @model MvcWebDemo.Models.SysUser <div> <h2>Delete</h2> <h3>Are you sure you want to delete this? </h3> <h4>User</h4> <dl> <dt>@Html.DisplayNameFor(model => model.UserName)</dt> <dd>@Html.DisplayFor(model => model.UserName)</dd> <dt>@Html.DisplayNameFor(model => model.Email)</dt> <dd>@Html.DisplayFor(model => model.Email)</dd> </dl> @using (Html.BeginForm()) { <div> <input type="submit" value="Delete" /> </div> } <div> @Html.ActionLink("Back to List", "Index") </div> </div> </body>
@model IEnumerable<MvcWebDemo.Models.SysUser>
body中添加个table用来显示数据
<body> @model IEnumerable<MvcWebDemo.Models.SysUser> <div> <p> @*ActionLink 生成一个<a>标签*@ @Html.ActionLink("Create SysUser", "Create") </p> <table> <tr> <th width="100px">@Html.DisplayNameFor(model => model.UserName)</th> <th width="150px">@Html.DisplayNameFor(model => model.Email)</th> <th width="350px">操作</th> </tr> @foreach (var item in Model) { <tr> <td>@Html.DisplayFor(modelItem => item.UserName)</td> <td>@Html.DisplayFor(modelItem => item.Email)</td> <td> @Html.ActionLink("SysUser Details", "Details", new { id = item.ID }) @Html.ActionLink("SysUser Edit", "Edit", new { id = item.ID }) @Html.ActionLink("SysUser Delete", "Delete", new { id = item.ID }) </td> </tr> } </table> </div> </body>
针对上面这些代码,我们提一下其中用到的HtmlHelper, 主要有这么几个:
DisplayNameFor (model=>model.xxx) 生成纯文本,显示xxx列名
DisplayFor (model=>model.xxx) 生成纯文本,显示xxx列的内容
LableFor 生成一个Lable标签
EditorFor 生成一个text类型的input
PasswordFor 类似于EditorFor, 隐藏文本内容
ActionLink 生成一个<a>标签
BeginForm 生成一个表单
显示结果:
总结
到此为止,我们对常用的CRUD做了介绍。View, Controller之间都是通过传递Model来交互的。
权责申明
作者:编程小纸条 出处: https://www.cnblogs.com/miro/category/620362.html