【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,根据主键删除。
如果删除的记录是其他实体的外键,则会报错,无法删除。
【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查的更多相关文章
- MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Java学习笔记——JDBC之与数据库MySQL的连接以及增删改查等操作
必须的准备工作 一.MySQL的安装.可以参考博文: http://blog.csdn.net/jueblog/article/details/9499245 二.下载 jdbc 驱动.可以从在官网上 ...
- Entity Framework应用:根据实体的EntityState状态实现增删改查
在上一篇文章中,我们讲解了使用EF实现简单的增删改成,在这篇文章中我们使用实体的EntityState状态来优化数据的增删改查. 一.修改数据 上篇文章中的修改数据的方法是EF官方推荐的方式,即先查询 ...
- MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存
二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: <!-- 查询学生,根据id --> <select id=" ...
- Mybatis学习总结(二)—使用接口实现数据的增删改查
在这一篇中,让我们使用接口来实现一个用户数据的增删改查. 完成后的项目结构如下图所示: 在这里,person代表了一个用户的实体类.在该类中,描述了相关的信息,包括id.name.age.id_num ...
- git学习笔记03-本地git常用操作及原理-文件增删改
1.查看git状态 git status 这个可以告诉我们对git做了哪些操,比如增删改 2.既然我们修改了东西,有的时候想看看修改了什么,毕竟我们的记忆力并不如电脑 git diff 文件名 (默 ...
- python Django 学习笔记(六)—— 写一个简单blog做增删改练手
简单效果图 1,创建一个项目myblog 可参考这里 myblog/ manage.py myblog/ __init__.py settings.py urls.py wsgi.py 2,创建blo ...
- Elasticsearch学习笔记(十)批量查询mget、批量增删改bulk
一.批量查询 mget GET /_mget { "docs":[ { "_index":" ...
- Python笔记·第五章—— 列表(List) 的增删改查及其他方法
一.列表的简介 列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[ ]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如:li = ...
随机推荐
- windows核心编程---第三章 内核对象及句柄本质
本章讨论的是相对抽象的概念,不涉及任何具体的内核对象的细节而是讨论所有内核对象的共有特性. 首先让我们来了解一下什么是内核对象.内核对象通过API来创建,每个内核对象是一个数据结构,它对应一块内存 ...
- C++ 调用 java jni.h 的使用
JNI c++ 调用 java ----------------------------------------------c++----------------------------------- ...
- Hibernate注解映射sequence时出现无序增长问题+hibernate 映射 oracle ID自动增长:
Hibernate注解映射sequence时出现无序增长问题+hibernate 映射 oracle ID自动增长: 通过Hibernate注解的方式映射oracel数据库的sequence主键生成器 ...
- 552 you must authentication
配置邮箱到outlook时 出现以下错误: 发送测试电子邮件消息: 无法发送此邮件.请在帐户属性中验证电子邮件地址. 响应服务器: 552 you must authentication 需要在”其 ...
- Java-->服务器的响应(Servlet--doGet&doPost)
--> Servelet: 用于接收请求(客户端,浏览器),做出响应的,服务器端的,java类 --> ServletLogin -- Web项目服务器响应的Java实现 package ...
- 如何使用NPOI 导出到excel和导入excel到数据库
近期一直在做如何将数据库的数据导出到excel和导入excel到数据库. 首先进入官网进行下载NPOI插件(http://npoi.codeplex.com/). 我用的NPOI1.2.5稳定版. 使 ...
- Ubuntu下两个gcc版本切换
Ubuntu系统使用的gcc版本随着发布版本的不同而不同,在编译Android系统时不同的版本推荐用不同的gcc去编译,那么可不可以改变系统的gcc来适应android编译环境的需求呢?答案是可以的. ...
- msp430FR5739 FRAM的学习
FRAM,中文名称为铁电存储器..FRAM提供一种与RAM一致的性能,但又有与ROM 一样的非易失性. FRAM 克服以上二种记忆体的缺陷并合并它们的优点,它是全新创造的产品,一个非易失性随机存取储存 ...
- 利用Code128字体将文本转换为code128条形码
利用Code128字体将文本转换为code128条形码[转] 最近在做仓储的项目,许多的打印文件都包含条形码,之前一直使用C39P24DhTt字体直接转换为39码,但是最近要求使用code128编 ...
- Keepalived 双机热备
使用 Keepalived 做双机热备非常简单,经常和 LVS 搭配来实现高可用负载平衡方案. 1. Master / Slave 首先准备两台测试服务器和一个虚拟IP. Server A: 192. ...