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




一.创建详细页
首先 我们先在控制器下 添加详细页的方法
因为这篇文章后面要介绍持久对象声明周期的变化 所以在这里先看下有哪些状态

EF里一共有这五中生命状态类型 其实 看名字我们可以大概猜测出个一二三来~~ 游离的 未改变的 新添加的 已删除的 修改的 但是是怎么变化的能
我们在后面的代码中实践与证实

public ActionResult Details(int id)
{ Student student= db.Students.Find(id);
EntityState statebefore = db.Entry(student).State; //通过find取出来得到的状态是 Unchanged
return View(student);
}

通过调试 我们可以看到 通过find取出来得到的状态是 Unchanged 没有变化的~~
这里面 我们用到了 db.Entry()方法 这个方法是很不错的 不仅可以看状态 还可以跟踪到OriginalValue(原始值),CurrentValue(当前值)和DatabaseValue(数据库值)
看到园子里已经有介绍这个的了 而且写的非常好~~ 这里直接把连接给大家 大家自己去看吧 文章连接
接着回到我们的项目~现在开始添加视图
这里面 我们不仅显示了该学生的详细信息 还显示了该学生选择的课程和成绩
因为我们的学生实体 有导航属性 Enrollments 这里面 遍历每一个Enrollments 来Enrollment 来得到分数 由于我们的Enrollment 实体 包含了课程实体的导航属性 所以可以得到
课程的名字
这里面 涉及到了延迟加载 等读取相关属性的多关系数据的加载 这个不是我们这节讨论的重点 这个会在第五节讨论 到时会把加载的方式 生成的sql语句 等 讲清楚的 放心吧~~
在这里暂时就先不说了 直接开始下面的创建页
二.创建添加页面
首先 依然是添加控制器下的方法 这里面的方法要记得是 HttpPost Create 不加post 就是get的方式 是直接访问页面时用的 post提交时用
其次 我们依然来看下这次生命周期状态的改变

[HttpPost]
public ActionResult Create(Student student)
{
try
{
// TODO: Add insert logic here
if (ModelState.IsValid)
{
EntityState statebefore = db.Entry(student).State; //Detached
db.Students.Add(student);
EntityState stateAdd = db.Entry(student).State; //Added
db.SaveChanges();
EntityState stateafter = db.Entry(student).State;//Unchanged
return RedirectToAction("Index");
}
}
catch
{
ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists see your system administrator."); }
return View(student);
}

先说个MVC的问题 这里面 我们可以直接把参数换成Create(Student student) 也可以使用FormCollection 来获得一个个值 但是推荐使用第一种方式~~
这里面的原理是 路由过来的或者参数过来的,会自动地赋值到对象的对应的属性上 做这个工作的就是实现了IModelBinder 接口的
有兴趣的可以去google下~~ 这里主讲EF MVC的东西顺带提下~
回到例子 我们可以看到 生命周期的变化 Detached--->Added---->Unchanged
添加视图
这里面我们选择开启验证 MVC验证会先验证客户端 再验证服务端 我们可以验证的有 是否为空 最大长度 最小长度 格式 比较是否相等等
这里 我们只需要在 实体上添加特性 MaxLength 等特性
这里我这有所有可以添加的特性的收集和介绍 大家可以看这个连接文章-----DataAnnotation验证
然后运行 发现当添加数据不符合要求时 会先进行js验证 提示错误 OK 添加就到这里
三.创建编辑页面

public ActionResult Edit(int id)
{
Student student = db.Students.Find(id);
return View(student);
} //
// POST: /Student/Edit/5 [HttpPost]
public ActionResult Edit(Student student)
{
// TODO: Add update logic here
if (ModelState.IsValid)
{
EntityState statebefore = db.Entry(student).State;
db.Entry(student).State = EntityState.Modified;
int i= db.SaveChanges();
EntityState stateafter= db.Entry(student).State;
return RedirectToAction("Index");
}
return View(student);
}

EF里的更新是这样的 通过更改 状态为EntityState.Modified 然后再保存 来实现更新操作的
我们可以看到 生命周期的变化 Detached--->Modified---->Unchanged
添加视图
四.创建删除页面

public ActionResult Delete(int id, bool? saveChangesError)
{
if (saveChangesError.GetValueOrDefault())
{
ViewBag.ErrorMessage = "Unable to save changes. Try again, and if the problem persists see your system administrator.";
}
return View(db.Students.Find(id));
} //
// POST: /Student/Delete/5 [HttpPost,ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
try
{
// TODO: Add delete logic here
Student student = db.Students.Find(id);
EntityState statebefore = db.Entry(student).State; //UnChange状态
db.Students.Remove(student);
EntityState stateafter = db.Entry(student).State;//Deleted状态
db.SaveChanges();
EntityState stateaOk = db.Entry(student).State;//Detached状态
return RedirectToAction("Index");
}
catch
{
return View();
}
}

这样就实现了删除了 这是原文博客里的方法 但我觉得很不合理
点击删除还要跳到专门的删除页 然后删除完再跳回来 这里 我们使用ajax来改造删除 来减少来回的跳页等的交互 以提高效率 (主要点写写MVC的应用了~~)
五.AJAX改造删除
我这里是用的 jquery ajax 用的习惯些~~
先改造控制器下的方法
主要是加上 if (Request.IsAjaxRequest()) 判断是否为ajax 接着 把返回类型改为 Content 返回-1 为修改失败 代码如下
接着是修改视图部分
首先 把原来的删除换成这句
<a name="Delete" stuid="@item.StudentID">Delete</a>
然后引用jquery 接着 实现删除~~

$(function () {
$("[name='Delete']").click(
function () {
if (confirm("确定要删除这条记录么?")) {
var stuid = $(this).attr("stuid");
var tr = $(this).parent().parent();
$.post("Student/Delete/", { id: stuid }, function (data) {
if (data == "-1") {
alert("删除失败");
}
else {
$(tr).remove();
alert("删除成功");
}
});
}
}
);
});

OK了 改造成功~~
六.确保数据库资源及时释放
原文里面最要提出 让Controller类继承 IDisposable接口 以确保资源的即使释放 这里我理解的还不是很深刻有兴趣的可以看下原文 但我把代码贴出来
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
七.总结
好了,简单的增删改查结束了 依然是没有多大难度的文章 新手可以看下 学习下EF的使用
这里面主要讲了 基本的CRUD和 这里面持久属性的状态的变化 并在后面用ajax重新实现了次删除明天写
排序 刷选 分页---- (这里我用的是国产的基于ScottGu的PagedList<T>类和相关方法完善的分页--MVCPager)
也是比较简单的 但至少更加贴近实际项目了~~
转载请保留下原文连接 谢谢~~ 原文地址
MVC3+EF4.1学习系列(二)-------基础的增删改查和持久对象的生命周期变化的更多相关文章
- MongoDB学习总结(二) —— 基本操作命令(增删改查)
上一篇介绍了MongoDB在Windows平台下的安装,这一篇介绍一下MongoDB的一些基本操作命令. 下面我们直奔主题,用简单的实例依次介绍一下. > 查看所有数据库 (show dbs) ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(二)
前言:上篇 JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(一) 介绍了下knockout.js的一些基础用法,由于篇幅的关系,所以只能分成两篇,望见谅!昨天就 ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(一)
前言:出于某种原因,需要学习下Knockout.js,这个组件很早前听说过,但一直没尝试使用,这两天学习了下,觉得它真心不错,双向绑定的机制简直太爽了.今天打算结合bootstrapTable和Kno ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(四):自定义T4模板快速生成页面
前言:上篇介绍了下ko增删改查的封装,确实节省了大量的js代码.博主是一个喜欢偷懒的人,总觉得这些基础的增删改查效果能不能通过一个什么工具直接生成页面效果,啥代码都不用写了,那该多爽.于是研究了下T4 ...
- JS组件系列——BootstrapTable+KnockoutJS实现增删改查解决方案(三):两个Viewmodel搞定增删改查
前言:之前博主分享过knockoutJS和BootstrapTable的一些基础用法,都是写基础应用,根本谈不上封装,仅仅是避免了html控件的取值和赋值,远远没有将MVVM的精妙展现出来.最近项目打 ...
- MVC3.0+knockout.js+Ajax 实现简单的增删改查
MVC3.0+knockout.js+Ajax 实现简单的增删改查 自从到北京入职以来就再也没有接触MVC,很多都已经淡忘了,最近一直在看knockout.js 和webAPI,本来打算采用MVC+k ...
- Mysql学习笔记(六)增删改查
PS:数据库最基本的操作就是增删改查了... 学习内容: 数据库的增删改查 1.增...其实就是向数据库中插入数据.. 插入语句 insert into table_name values(" ...
- Ecmall二次开发-增删改查操作
Ecmall二次开发-增删改查操作 Model目录includes/models 自己添加需要的model class OrdercomplainModel extends BaseModel //类 ...
- hibernate系列笔记(1)---Hibernate增删改查
Hibernate增删改查 1.首先我们要知道什么是Hibernate Hibernate是一个轻量级的ORMapping对象.主要用来实现Java和数据库表之间的映射,除此之外还提供数据查询和数据获 ...
随机推荐
- lua中的面向对象编程
简单说说Lua中的面向对象 Lua中的table就是一种对象,看以下一段简单的代码: 上述代码会输出tb1 ~= tb2.说明两个具有相同值得对象是两个不同的对象,同时在Lua中table是引用类型的 ...
- js 数值格式化函数
function ForDight(Dight,How){ ,How))/Math.pow(,How); return Dight; } //ForDight(Dight,How):数值格式化函数; ...
- Openjudge-NOI题库-和为给定数
题目描述 Description 给出若干个整数,询问其中是否有一对数的和等于给定的数. 输入输出格式 Input/output 输入格式: 共三行: 第一行是整数n(0 < n <= ...
- usaco 2.2.4 生日派对灯(最近写题碰到的,虽然知道现在写这个有点晚了)
经过分析,他看似很多的开灯的方法其实合并起来就只有八个. 首先,一个开关在执行的时候只能按一次(因为你就算按了两次就相当于一次也没有按). 当一个都不按的时候 当然就只有一种:不按. 当按一下的时候 ...
- 在vim编辑器中,删除操作
我这里在编辑一个很大的文件,有几万行,都是文件名sheetid, 中间有很多空行,我现在要做的事情就有要把这个文件中的空行都删除掉,这个本来想在ultraedit里面完成的,结果弄了好半天都没有搞定, ...
- zabbix 布署实践【4 服务器自动探索发现,并且自动关联模版】
使用管理员登录zabbix后,在配置---自动发现--创建发现规则 如下:我们的需求是监听办公网内openstack的所有虚拟机,在其VM创建后,自动加到zabbix监控中来,并自动关联监控模版 可以 ...
- AnimatorController反向运动学IK
通过使用反向运动学IK,我们可以根据需要控制角色身体某个特定部位进行旋转或移动,达到想要的一些效果,比如:在移动时,让一只脚带伤拖行:让手抬起去拿桌上的苹果:让脑袋一直面向我们的色像机,就像一直注视着 ...
- 加速Android Studio的Gradle构建速度
在利用Android Studio做项目时,发现随着项目内资源的逐渐增多(或者项目创建时间太过久远,而又未经常打开),Android Studio的build速度也越来越慢.(P.S.在做我的CSGO ...
- C#中XmlSerializer的内存占用问题
被XmlSerializer掉坑里了,爬了一晚上才出来. 本来实现一个功能,从数据库中查出一堆数据(比较多,几十万,不过,是分批查出来的),查出来的数据包含了一个XML字符串,代码中对其进行序列化,一 ...
- 项目版本管理 github简介
git config user.email "c.wuliying@samsung.com"git config user.name "swportal" ** ...