【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查

讲解之前,先来看一下我们的数据库结构:班级表 学生表

如上图,实体状态由EntityState枚举定义:Detached(未跟踪)、Unchanged(未改变)、Added(已添加)、Deleted(已删除)、Modified(已修改)

查看实体状态

//查看实体状态
using (var db = new Entities())
{var query = db.Student.First();Console.WriteLine(db.Entry(query).State);//输出Unchanged
}

执行结果:

说明:输出结果 Unchanged ,已加载到上下文中的实体为Unchanged状态。

标记实体状态

Console.WriteLine("==========标记状态 EntityState.Unchanged===========");Student student;
using (var db = new Entities())
{student = db.Student.Where(s => s.StudentName == "张三").First();
}//查看实体状态
using (var db = new Entities())
{Console.WriteLine(db.Entry(student).State);//输出Detached
db.Student.Attach(student);//将实体附加到上下文中Console.WriteLine(db.Entry(student).State);//输出Unchanged
db.SaveChanges();//未执行SQL语句
}

执行结果:

说明:上图中student对象定义在上下文作用域之外,所以默认是Detached未跟踪状态。

调用Attach方法将对象附加到上下文中,状态变为Unchanged。

Unchanged状态为未改变,所以调用db.SaveChanges方法不执行SQL语句。

标记状态 EntityState.Added

using (var db = new Entities())
{var classes = new Classes(){ClassName = "英语10501"};Console.WriteLine(db.Entry(classes).State);//输出 Detached
db.Entry(classes).State = System.Data.Entity.EntityState.Added;//修改状态为Added//db.Classes.Add(classes);  //调用DBSet.Add方法同样的效果
Console.WriteLine(db.Entry(classes).State);//输出 Added

    db.SaveChanges();//更新到数据库
}

执行结果:

说明:修改状态调用Entry方法,由Detached-->Added。DBSet.Add方法同样效果。

标记状态 EntityState.Modified

方式一:更新指定字段

//方式一:更新部分字段
using (var db = new Entities())
{var student = db.Student.Where(s => s.StudentName == "张三").First();Console.WriteLine(db.Entry(student).State);//输出Detached
student.StudentName = "张三丰";Console.WriteLine(db.Entry(student).State);//输出Modified
db.SaveChanges();
}

追踪SQL语句:

执行结果:

说明:根据生成的SQL语句可知,只更新了StudentName字段。未实体赋值将改变实体状态 Unchanged-->Modified。

方式二:更新所有

using (var db = new Entities())
{var student = db.Student.Where(s => s.StudentName == "张三").First();Console.WriteLine(db.Entry(student).State);//输出Detached
db.Entry(student).State = System.Data.Entity.EntityState.Modified;student.StudentName = "张三丰";Console.WriteLine(db.Entry(student).State);//输出Modified
db.SaveChanges();
}

追踪SQL语句:

执行结果:

说明:调用Entry方法改变实体状态 Unchanged-->Modified,会生成更新所有字段的SQL。

    student.StudentName = "张三丰";db.Entry(student).State = System.Data.Entity.EntityState.Modified;

这两句顺序颠倒,效果相同。

标记状态 EntityState.Deleted

using (var db = new Entities())
{var student = db.Student.Where(n=>n.StudentName=="小芳").Single();Console.WriteLine(db.Entry(student).State);//输出Unchanged
db.Entry(student).State = System.Data.Entity.EntityState.Deleted;//db.Student.Remove(student);
Console.WriteLine(db.Entry(student).State);//输出Detached
db.SaveChanges();
}

追踪SQL语句:

执行结果对比:

说明:执行了2条SQL语句:实体状态由Unchange---->Deleted,根据主键删除。

如果删除的记录是其他实体的外键,则会报错,无法删除。

posted on 2016-08-09 17:48 思如雨 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/gosky/p/5754128.html

【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查相关推荐

  1. MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)...

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  2. 【java项目学习笔记】Java学生管理系统(纯后端基础--增删改查)

    学生管理系统 在一所学校中,对学生人员流动的管理是很麻烦的,本案例要求编写一个学生管理系统,实现对学生信息的添加.删除.修改和查询功能.每个功能的具体要求如下: 系统的首页 用于显示系统所有的操作,并 ...

  3. Entity Framework应用:根据实体的EntityState状态实现增删改查

    在上一篇文章中,我们讲解了使用EF实现简单的增删改成,在这篇文章中我们使用实体的EntityState状态来优化数据的增删改查. 一.修改数据 上篇文章中的修改数据的方法是EF官方推荐的方式,即先查询 ...

  4. EF实现——后台登陆,记住密码+主页面欢迎+管理员增删改查

    1.创建数据库 CREATE DATABASE Permission; --创建数据库 CREATE TABLE [dbo].[AdminUser]([Id] [int] IDENTITY(1,1) ...

  5. beego原生mysql查询_Beego基础学习(五)Golang原生sql操作Mysql数据库增删改查(基于Beego下测试)...

    //控制器文件 package controllers import ("fmt" "github.com/astaxie/beego" "mypro ...

  6. vb.net调用oracle存储过程,vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc...

    vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc 我的VBNETORACLE增删改查学习笔记(本源码在VBNET2008下测试通过)学习VBNET有一段时间了,之 ...

  7. 数据库之OrmLite的简单学习:增删改查_两个表

    参考学习网址: 1.android OrmLite 入门 - ziqiang1的专栏 - CSDN博客 http://blog.csdn.net/ziqiang1/article/details/52 ...

  8. JavaWeb黑马旅游网-学习笔记09【旅游线路收藏】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  9. 【EF学习笔记07】----------加载关联表的数据 贪婪加载

    [EF学习笔记07]----------加载关联表的数据 贪婪加载 讲解之前,先来看一下我们的数据库结构:班级表 学生表 贪婪加载 //贪婪加载 using (var db = new Entitie ...

最新文章

  1. 1.2、什么是函数?什么是方法
  2. BP神经网络 语音信号分类
  3. String为什么是不可变类型?
  4. 刷新,开启云信下一个 5 年:专注做技术长跑里,最重要的事
  5. Python 安装 uWSGI并运行一个入门示例
  6. boost::spirit模块演示了 AST 的生成,然后将其转储为人类可读的格式
  7. OkHttp3中的HTTP/2首部压缩
  8. Shit和trash不是评价设计的词汇
  9. linux 内核3.8,[Beaglebone] BBB迁移到linux 3.8实时内核
  10. MySQL中NOT IN语句对NULL值的处理
  11. 怎样用命令查看Mysql数据库大小?
  12. 串口通信软件AccessPort
  13. LintCode 快速幂
  14. struts框架——ActionForm+DynaActionForm
  15. 钉钉isv接入三方应用授权鉴权流程
  16. 【C++】【记录自己的自学过程】用纯C++实现模拟银行注册 存款 取款 贷款 升级账户 等服务。主要用的内容包括多态,封装。
  17. Mysql从入门到入魔——9. 游标、高级SQL特性
  18. C++,OpenCV 中template(模板)的简单理解
  19. 实践任务1:利用 HBuilderX制作产品展示模块+实践任务2:利用 HBuilderX制作公司网站首页+实践任务3: 利用 HBuilderX制作公司网站首页实现固定侧边菜单
  20. Linux三剑客 grep sed awk 详细使用方法

热门文章

  1. 【机器视觉】 executable_expression算子
  2. 【Linux】一步一步学Linux——arping命令(164)
  3. 【Linux网络编程】TCP 和 UDP 数据报格式详解
  4. Git/Github--push自己的第一段代码
  5. 每天一道LeetCode-----数独盘求解
  6. LVS(15)——tun技术
  7. Spark(1)——spark基本原理与启动
  8. CFile读写文件 实现复制文件功能
  9. 思科模拟器。计算机网络实验之四:RIPv2配置
  10. Leetcode题库 94.二叉树的中序遍历(递归 C实现)