【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,根据主键删除。
如果删除的记录是其他实体的外键,则会报错,无法删除。
转载于:https://www.cnblogs.com/gosky/p/5754128.html
【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查相关推荐
- MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)...
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 【java项目学习笔记】Java学生管理系统(纯后端基础--增删改查)
学生管理系统 在一所学校中,对学生人员流动的管理是很麻烦的,本案例要求编写一个学生管理系统,实现对学生信息的添加.删除.修改和查询功能.每个功能的具体要求如下: 系统的首页 用于显示系统所有的操作,并 ...
- Entity Framework应用:根据实体的EntityState状态实现增删改查
在上一篇文章中,我们讲解了使用EF实现简单的增删改成,在这篇文章中我们使用实体的EntityState状态来优化数据的增删改查. 一.修改数据 上篇文章中的修改数据的方法是EF官方推荐的方式,即先查询 ...
- EF实现——后台登陆,记住密码+主页面欢迎+管理员增删改查
1.创建数据库 CREATE DATABASE Permission; --创建数据库 CREATE TABLE [dbo].[AdminUser]([Id] [int] IDENTITY(1,1) ...
- beego原生mysql查询_Beego基础学习(五)Golang原生sql操作Mysql数据库增删改查(基于Beego下测试)...
//控制器文件 package controllers import ("fmt" "github.com/astaxie/beego" "mypro ...
- vb.net调用oracle存储过程,vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc...
vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc 我的VBNETORACLE增删改查学习笔记(本源码在VBNET2008下测试通过)学习VBNET有一段时间了,之 ...
- 数据库之OrmLite的简单学习:增删改查_两个表
参考学习网址: 1.android OrmLite 入门 - ziqiang1的专栏 - CSDN博客 http://blog.csdn.net/ziqiang1/article/details/52 ...
- JavaWeb黑马旅游网-学习笔记09【旅游线路收藏】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- 【EF学习笔记07】----------加载关联表的数据 贪婪加载
[EF学习笔记07]----------加载关联表的数据 贪婪加载 讲解之前,先来看一下我们的数据库结构:班级表 学生表 贪婪加载 //贪婪加载 using (var db = new Entitie ...
最新文章
- 1.2、什么是函数?什么是方法
- BP神经网络 语音信号分类
- String为什么是不可变类型?
- 刷新,开启云信下一个 5 年:专注做技术长跑里,最重要的事
- Python 安装 uWSGI并运行一个入门示例
- boost::spirit模块演示了 AST 的生成,然后将其转储为人类可读的格式
- OkHttp3中的HTTP/2首部压缩
- Shit和trash不是评价设计的词汇
- linux 内核3.8,[Beaglebone] BBB迁移到linux 3.8实时内核
- MySQL中NOT IN语句对NULL值的处理
- 怎样用命令查看Mysql数据库大小?
- 串口通信软件AccessPort
- LintCode 快速幂
- struts框架——ActionForm+DynaActionForm
- 钉钉isv接入三方应用授权鉴权流程
- 【C++】【记录自己的自学过程】用纯C++实现模拟银行注册 存款 取款 贷款 升级账户 等服务。主要用的内容包括多态,封装。
- Mysql从入门到入魔——9. 游标、高级SQL特性
- C++,OpenCV 中template(模板)的简单理解
- 实践任务1:利用 HBuilderX制作产品展示模块+实践任务2:利用 HBuilderX制作公司网站首页+实践任务3: 利用 HBuilderX制作公司网站首页实现固定侧边菜单
- Linux三剑客 grep sed awk 详细使用方法