本篇原文链接:

Implementing Basic CRUD Functionality

说明:学习笔记参考原文中的流程,为了增加实际操作性,并能够深入理解,部分地方根据实际情况做了一些调整;并且根据自己的理解做了一些扩展。

本人的学习环境: VS2017 + EF 6.1.3 + .NET 4.6.1

上一篇已完成数据库创建、基本的List页面显示;本篇操练如何进行增删改查;

第一步: Read (Details)

这个相对比较简单,只是显示详细信息,具体显示的一些技巧还是要学习 MVC的View的语法和用法;这里只看一个基本功能;

为Student控制器新建Details Action:  (通过请求送进来的ID参数来检索到Student实例,再送到View里去显示;)

public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest);
}
Student student = db.Students.Find(id);
if (student == null)
{
return HttpNotFound();
}
return View(student);
}

为Details Action新增View : (Template名字就是Details , 强类型选择Student , 上下文选 SchoolContext)

默认情况下,学生的课程记录不会显示出来;如下:

把View加入以下代码:

        <dt>
@Html.DisplayNameFor(model=>model.Enrollments)
</dt>
<dd>
<table class="table">
<tr>
<th>Course Title</th>
<th>Grade</th>
</tr>
@foreach(var item in Model.Enrollments)
{
<tr>
<td>
@Html.DisplayFor(modelitem=>item.Course.Title)
</td>
<td>
@Html.DisplayFor(modelitem => item.Grade)
</td>
</tr>
}
</table>
</dd>

则可以显示该学生的课程记录:

第二步: Create

Create操作是有两个Action完成的,一个Get Action用来显示新建页面,一个Post Action 用来处理新增;

Get Action比较简单:

public ActionResult Create()
{
return View();
}

然后为Create Action新增Create View ( Template 选择 Create , 强类型选择Student, 上下文选择 SchoolContext)

在这个实验里可以不用删除输入项,在具体项目中可根据实际需要进行输入的项目进行保留,其他不需要用户输入的,则可以从View中删除;

这里就带来了一个设定,为了防止有人恶意地在提交的请求数据中加入我们不希望用户输入的字段值,那么如果不做控制,则这个值就会被写入数据库中;

这就带来的风险,所以在 Post Creat Action中,增加了 [Bind(Include = "LastName, FirstMidName, EnrollmentDate")] 这个限制;

当然既然可以采用Include 限制,那么也可以用exclude来表示除了某某字段;

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "LastName, FirstMidName, EnrollmentDate")]Student student)
{
  try
{
  if (ModelState.IsValid)
{
  db.Students.Add(student);
  db.SaveChanges();
  return RedirectToAction("Index");
}
}
catch (DataException /* dex */)
{
//Log the error (uncomment dex variable name and add a line here to write a log.
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator.");
}
return View(student);
}

至于如何进行Model数据验证,则可以参考MVC的一些资料;(例如限制非空、限制长度、正则表达式、以及自定义Remote验证)

另外,为Action增加[ValidateAntiForgeryToken] 验证属性,配合View中@Html.AntiForgeryToken() 来防止 cross-site request forgery 跨站请求伪造;

第三步:Edit (Update)

Edit也是分为两个Action, 一个是HttpGet Action为了取现有数据来显示,一个是HttpPost Action为了把修改后的值传回去;

先手动增加 HttpGet Edit Action:

      public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest);
}
Student student = db.Students.Find(id);
if (student == null)
{
return HttpNotFound();
}
return View(student);
}

然后创建一个强类型的View:

这个View基本可以不用改动,在实际项目中,可以进行调整显示;

重点是 HttpPost的Edit Action , 原文中的标准写法:

     [HttpPost, ActionName("Edit")]
[ValidateAntiForgeryToken]
public ActionResult EditPost(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest);
}
var studentToUpdate = db.Students.Find(id);
if (TryUpdateModel(studentToUpdate, "",
new string[] { "LastName", "FirstMidName", "EnrollmentDate" }))
{
try
{
db.SaveChanges();
return RedirectToAction("Index");
}
catch (DataException /* dex */)
{
//Log the error (uncomment dex variable name and add a line here to write a log.
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
}
}
return View(studentToUpdate);
}

首先,他Action Name没有直接定义为Edit, 而是通过属性里通过ActioName强制定义为Edit;

其次,一开始觉得比较神奇的是,参数里只写了 int? id ,按照以往的理解,这个地方应该直接通过模型绑定,和Create一样直接输入一个Student的实例啊;看到这里确实有点蒙;

不过,仔细研究了下面那个TryUpdateModel后就能理解了,这个方法有10多种多载,实现手段也就非常灵活,具体资料需要再参考 TryUpdateModel 的详细说明;

原文例子中,通过第3个参数实现了数据更新字段的限定,即如果模型有10来个字段,但允许用户编辑的只有3个,那么通过 new string[] { "LastName", "FirstMidName", "EnrollmentDate" } 这个参数可以限制哪3个字段可以被更新;其他的保持不变;

另外一种Edit写法:

        [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "ID,LastName,FirstMidName,EnrollmentDate")] Student student)
{
if (ModelState.IsValid)
{
db.Entry(student).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(student);
}

第四步:Delete

删除相对比较简单,也是一个 HttpGet Delete 和一个HttpPost Delete Action;

HttpGet Delete Action:

        public ActionResult Delete(int? id, bool? saveChangesError = false)
{
if (id == null)
{
return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest);
}
if (saveChangesError.GetValueOrDefault())
{
ViewBag.ErrorMessage = "Delete failed. Try again, and if the problem persists see your system administrator.";
}
Student student = db.Students.Find(id);
if (student == null)
{
return HttpNotFound();
}
return View(student);
}

增加的 bool? saveChangesError = false 是了httpPost Delete Action在发生错误的时候,重新用httpget Delete Action来显示相关错误信息;
HttpPost Delete Action:

        [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Delete(int id)
{
try
{
//方法一
//Student student = db.Students.Find(id);
//db.Students.Remove(student);
//db.SaveChanges(); //方法二
Student studentToDelete = new Student() { ID = id };
db.Entry(studentToDelete).State = EntityState.Deleted;
db.SaveChanges();
}
catch (DataException/* dex */)
{
//Log the error (uncomment dex variable name and add a line here to write a log.
return RedirectToAction("Delete", new { id = id, saveChangesError = true });
}
return RedirectToAction("Index");
}

方法1比方法2效率低一点;方法一需要先检索一下数据库,然后再执行删除操作;
但是方法二只能用主关键字来进行登记删除状态,好处是效率高一点;

最后一步:关闭数据库连接

通过重载Dispose实现:

        protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}

【EF6学习笔记】(二)操练 CRUD 增删改查的更多相关文章

  1. Mysql学习笔记(六)增删改查

    PS:数据库最基本的操作就是增删改查了... 学习内容: 数据库的增删改查 1.增...其实就是向数据库中插入数据.. 插入语句 insert into table_name values(" ...

  2. EF6 学习笔记(二):操练 CRUD 增删改查

    EF6学习笔记总目录 ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 接上篇: EF6 学习笔记(一):Code First 方式生成数据库及初始化数据库实际操作 本篇原文链接: I ...

  3. MVC3+EF4.1学习系列(二)-------基础的增删改查和持久对象的生命周期变化

    上篇文章中 我们已经创建了EF4.1基于code first的例子  有了数据库 并初始化了一些数据  今天这里写基础的增删改查和持久对象的生命周期变化 学习下原文先把运行好的原图贴来上~~ 一.创建 ...

  4. mysql学习笔记一 —— 数据的增删改查

    1.连接mysql mysql 直接回车(是以root身份,密码空,登陆的是本机localhost) [root@www mysql]# mysql -uroot -p123 -S /var/lib/ ...

  5. MongoDB学习总结(二) —— 基本操作命令(增删改查)

    上一篇介绍了MongoDB在Windows平台下的安装,这一篇介绍一下MongoDB的一些基本操作命令. 下面我们直奔主题,用简单的实例依次介绍一下. > 查看所有数据库 (show dbs) ...

  6. hibernate学习笔记之四 Hibernate的增删改查

    采用JUnit测试,继承TestCase import java.util.Date; import junit.framework.TestCase; import org.hibernate.Se ...

  7. SQL Server -- 回忆笔记(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询

    SQL Server知识点回忆篇(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询 1. insert 如果sql server设置的排序规则不是简体中文,必须在简体中文字符串前加N, ...

  8. 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序

    使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...

  9. 前端的CRUD增删改查的小例子

    前端的CRUD增删改查的小例子 1.效果演示 2.相关代码: <!DOCTYPE html> <html lang="en"> <head> & ...

随机推荐

  1. ORM创建多表以及多表的增删改查

    一. 多表的创建 1. 一对一 在哪个表中设置都行,但是添加数据的时候需要现在没有外键的表中添加数据 models.OneToOneField(to="表名",to_field=& ...

  2. CentOS 6下升级Python版本

    CentOS6.8默认的python版本是2.6,而现在好多python组件开始只支持2.7以上的版本,比如说我今天遇到的pip install pysqlite,升级python版本是一个痛苦但又常 ...

  3. 浅析列表页请求优化(history API)

    最近搞了下列表页请求的功能,并做了一下调研整理,记此文备忘. 列表页请求的功能到处可见,比如在博客园. 点击相应的页码,页面返回相应的内容,看上去似乎大同小异,但是一些小的细节还是可以区分优劣. fu ...

  4. 自学Python第一天

    大学毕业后在一家第三方小程序公司做客服,心有不甘,看着同学们有做安防售前的,有在政府.企业里面做网络工程师的.更有甚者天天搭建个云计算啥的都是家常便饭,再想想自己,堂堂网络工程专业,却做了客服,还是没 ...

  5. 将preg_replace()改写为preg_replace_callback()

    preg_replace()函数使用/e修饰符可能带来安全隐患,PHP5.5之后,该用法被抛弃使用,升级为preg_replace_callback().在新版本下运行老版本的代码,会出现错误,如: ...

  6. STM32-跑马灯实验

    实验环境: STM32开发板 Keil uVision4 FlyMcu.exe 一. 建立文件夹 1.建立跟文件夹"BASE"(名称任意),再在其下建立四个子文件夹 2. 在&qu ...

  7. SJCP认证题前五十题填坑

    在做Java的SJCP认证试题时自己整理了一些Java基础细节知识点,以下是知识点陈列 1.标签机制:标签起作用的唯一的地方刚好在迭代语句之前(不然编译错误) continue label1 直接转到 ...

  8. Node.js中实现套接字服务

    后端服务的一个重要的部分是通过套接字进行通信的能力. 套接字允许一个进程通过一个IP地址和端口与另一个进程通信 同一个服务器上的两个不同进程的进程间通信(IPC)或者访问一个完全不同 的服务器上运行的 ...

  9. 12-Python操作json

    1.概述 Python操作json文件在测试中会经常用到,那么python怎么操作json文件呢,今天就来简单了解一下.Python中提供了dumps.dump.loads.load,用于字符串 和 ...

  10. js:函数与变量作用域的提升

    一.要彻底理解JS的作用域和Hoisting,只要记住以下三点即可:      1.所有申明都会被提升到作用域的最顶上      2.同一个变量申明只进行一次,并且因此其他申明都会被忽略      3 ...