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

如上图,实体状态由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 枚举标记实体状态,实现增删改查的更多相关文章

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

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

  2. Java学习笔记——JDBC之与数据库MySQL的连接以及增删改查等操作

    必须的准备工作 一.MySQL的安装.可以参考博文: http://blog.csdn.net/jueblog/article/details/9499245 二.下载 jdbc 驱动.可以从在官网上 ...

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

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

  4. MyBatis学习(二)、SQL语句映射文件(2)增删改查、参数、缓存

    二.SQL语句映射文件(2)增删改查.参数.缓存 2.2 select 一个select 元素非常简单.例如: <!-- 查询学生,根据id --> <select id=" ...

  5. Mybatis学习总结(二)—使用接口实现数据的增删改查

    在这一篇中,让我们使用接口来实现一个用户数据的增删改查. 完成后的项目结构如下图所示: 在这里,person代表了一个用户的实体类.在该类中,描述了相关的信息,包括id.name.age.id_num ...

  6. git学习笔记03-本地git常用操作及原理-文件增删改

    1.查看git状态 git status  这个可以告诉我们对git做了哪些操,比如增删改 2.既然我们修改了东西,有的时候想看看修改了什么,毕竟我们的记忆力并不如电脑 git diff 文件名 (默 ...

  7. python Django 学习笔记(六)—— 写一个简单blog做增删改练手

    简单效果图 1,创建一个项目myblog 可参考这里 myblog/ manage.py myblog/ __init__.py settings.py urls.py wsgi.py 2,创建blo ...

  8. Elasticsearch学习笔记(十)批量查询mget、批量增删改bulk

    一.批量查询  mget             GET /_mget {   "docs":[       {         "_index":" ...

  9. Python笔记·第五章—— 列表(List) 的增删改查及其他方法

    一.列表的简介   列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[ ]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如:li = ...

随机推荐

  1. 实验三 java敏捷开发与XP

    一.实验内容 (一)敏捷开发与XP 软件开发流程的目的是为了提高软件开发.运营.维护的效率,并提高软件的质量.用户满意度.可靠性和软件的可维护性. 光有各种流程的思想是不够的,我们还要有一系列的工具来 ...

  2. segues的类型

    Name Interface Builder symbol Description Show Present the content in the detail or master area depe ...

  3. having()方法设置查询条件,where()设置查询条件

    having  和 where区别 ① 使用有先后顺序 ② where  price>100     having price>100 ③ where  设置条件,字段必须是数据表中存在的 ...

  4. 数据库使用fmdb

    #import "SQLdataManger.h" #import "FMDatabaseAdditions.h" static SQLdataManger * ...

  5. javascript 封装(给自己看)

    HTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  6. 路由器DHCP 动态主机配置

    进入ip设置:ip pool fw 添加网关gateway-list 192.168.1.1 添加网段network 192.168.1.0 mask 255.255.255.0 域名 dns-lis ...

  7. ubuntu 常用命令

    此处为使用ubuntu中常用的命令,不会全面深入讲解命令,仅供日常使用查看,以备遗忘. 不定时更新! 1.远程传输文件(小文件) scp [user@源文件地址:/目录/.../file] [目的地址 ...

  8. crontab 移动日志-超越昨天的自己系列(12)

    linux上定时执行某些脚本是管理服务器的时候比较常用的场景,比如定时检查进程是否存在,定时启动或关闭进程,定时检查日志删除日志等. 当我打开google百度crontab时长篇大论的一大堆,详细解释 ...

  9. 关于 MAXScript 逐行写入文本

    官方帮助文档FileStream Values部分有相关介绍. fn format_txt filepath filetext = ( if doesFileExist filepath == tru ...

  10. nunjucks.js模板渲染

    直接用 script 引入文件: <script src="nunjucks.js"></script> 是使用 render 来直接渲染文件,这种方式支持 ...