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

如上图,实体状态由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. 【winform 学习】C# 转换成JSON对象

    C#里面对json的处理有2种,JavaScriptSerializer和DataContractJsonSerializer. JavaScriptSerializer读出来就是key-value  ...

  2. RabbitMQ/JAVA (发布/订阅模式)

    发布/订阅模式即生产者将消息发送给多个消费者. 下面介绍几个在发布/订阅模式中的关键概念-- 1. Exchanges (转发器) 可能原来我们都是基于一个队列发送和接收消息.现在介绍一下完整的消息传 ...

  3. OD调试篇13

    今天的程序比较大,听说还是比较牛的程序,不过破解它的一个比较老的版本的.打开程序看看. 点击about   然后点enter registration code    输入name  以及密钥之后,会 ...

  4. 深入了解Hibernate的缓存使用

    Hibernate缓存 缓存是计算机领域的概念,它介于应用程序和永久性数据存储源(如在硬盘上的文件或者数据库)之间,其作用是降低应用程序 直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中 ...

  5. C#与XML Schema的问题

    http://bbs.csdn.net/topics/50493564 weileily: 用XmlSchema.Read方法读取了一个xsd文件,请问如何遍历检索器中的ComplexType与Sim ...

  6. 史上最全的html标签属性用法对照表

    html标签特效代码语法使用对照说明 <!> 跑马灯 <marquee>...</marquee>普通卷动 <marquee behavior=slide&g ...

  7. C++中的初始化

    C++中的RAII机制指明”对象创建时通过构造函数进行初始化,析构时通过析构函数释放资源”,但实际中因类无构造函数时编译器将自动合成一个默认构造函数,该构造函数只服务于自身编译器构造需要而不负责对象成 ...

  8. [翻译]Understanding Weak References(理解弱引用)

    原文 Understanding Weak References Posted by enicholas on May 4, 2006 at 5:06 PM PDT 译文 我面试的这几个人怎么这么渣啊 ...

  9. codeforces194a

    link:http://codeforces.com/contest/334/problem/A 很有意思的一道构造题.发现CF上经常出这种不难但是很不错的构造题. #include <iost ...

  10. 排序算法总结(三)选择排序【Select Sort】

    一.原理 选择排序的原理非常简单,就是选出最小(大)的数放在第一位,在剩下的数中,选出最小(大)的数,放在第二位......重复上述步骤,直到最后一个数. 二.过程 原始数据 第一次排序,选出最小的数 ...