关于EF的五种状态
最近半个多月没更新原因是在赶项目。。。在做项目的时候就会发现自己很多问题,也有很多东西要记录,今天就记录一下对ef新的认识。
也就是关于ef的五种状态管理。
- Unchanged(持久态)
- Midified(修改)
- Deleted(删除)
- Added(新增)
- Detached(游离态:相当于new出来的和数据库无关,在我看来也该就是using的时候的状态)
解释一下整个图的流程吧。
Added,也就是从游离态到 Added新增状态,在集合DbSet调用Add()方法之前都是处于游离的状态,调用之后就变成了Added(在没有Savechanges()之前)
在调用Savechanges之后就和数据库同步了,这个时候它的状态就变成 Unchanged(持久态:没有发生变化)。
Midified,对于修改,平常在做项目的时候发现做修改要先从数据库取得数据,然后对某一属性(字段)进行修改,在调用Savechanges后,又回到Unchanged状态了。
Deleted,删除,和修改原理差不多,在调用Remove()方法之后,就变成Deleted状态,这个比较好理解。但是在我还没进行Savechanges之前它此时的状态还是Deleted。在Savechanges()之后它就会回到原始的Detached(游离态),此时数据库数据已经没有了,但是这个对象还存在。
举个栗子:
using(Context db=new Context)
{
var type= db.Book.Find();
Console.WriteLine(db.Entry(type).State); //此时只是从数据库取出来,所以状态应该是Unchanged持久态
db.Book.Remove(type);
Console.WriteLine(db.Entry(type).State); //此时调用Remove()状态,还没有保存之前,应该是Deleted
db.SaveChanges();
Console.WriteLine(db.Entry(type).State); //调用SaveChanges()方法之后,此时状态应该是回到Detached游离态,这个时候彻底的和数据库没有关系了
}
实际上在做删除的时候可以不需要从数据库中查一次,这样也是减少了sql语句的执行,性能也会相应的提高,但是这个方法也是比较笨重。
var type=new Models.Book(){Id=};
Console.WriteLine(db.Entry(type).State); //此时new了一下和数据库无关所以状态是Detached
db.Entry(type).State=System.Data.Entity.EntityState.Unchanged; //欺骗服务器,不经过数据库直接改状态
db.Book.Remove(type);
Console.WriteLine(db.Entity(type).State); //Remove()后,此时状态应该是Deleted
db.SaveChanges();
Console.WriteLine(db.Entity(type).State); //此时状态又回到了Detached
关于EF的五种状态的更多相关文章
- 细说进程五种状态的生老病死——双胞胎兄弟Java线程
java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...
- ios应运程序的五种状态
ios应运程序的五种状态即转化 从apple的官方文档扣下来的 5状态: Not running The app has not been launched or was running but w ...
- jsp页面加载readyState的五种状态根据我们状态添加进度条
这段代码放在页面最下面 原文如下: document.onreadystatechange = subSomething;//当页面加载状态改变的时候执行这个方法. function subSomet ...
- 转 XMLHttpRequest().readyState的五种状态详解
转 http://javathinker.blog.ccidnet.com/blog-htm-itemid-1262479-do-showone-type-blog-uid-36384.html 在& ...
- Js--AJAX的小知识(一):ajax的五种状态
一.ajax的五种状态(readyState ) 0 - (未初始化)还没有调用send()方法 1 - (载入)已调用send()方法,正在发送请求 2 - (载入完成)send()方法执行完成,已 ...
- ServiceWork的五种状态
[ServiceWork的五种状态] installing.installed.activating.activated.redundant 参考:https://developer.mozilla. ...
- java线程五种状态
java线程五种状态: 创建 -> 就绪 -> 运行 -> 销毁 创建 -> 就绪 -> 运行 -> 等待(缺少资源) -> 销毁 下图:各种状态转换
- Java 多线程 线程的五种状态,线程 Sleep, Wait, notify, notifyAll
一.先来看看Thread类里面都有哪几种状态,在Thread.class中可以找到这个枚举,它定义了线程的相关状态: public enum State { NEW, RUNNABLE, BLOCKE ...
- Thread之一:线程生命周期及五种状态
<Thread之一:线程生命周期及五种状态> <juc线程池原理(四): 线程池状态介绍> 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较 ...
随机推荐
- shell脚本常用命令汇总
一.shell脚本概述和入门 (1)shell脚本是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核 (2)shell脚本的常用执行方式: 第一种:采用bash或sh+脚本的相对路径或 ...
- 「雕爷学编程」Arduino动手做(32)——雨滴传感器模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...
- python操作MySQL之pymysql模块
import pymysql#pip install pymysql db=pymysql.connect(','day040') cursor=db.cursor() #创建游标 book_list ...
- mysql基本操作汇总
1.数据库操作 (1)创建数据库 CREATE DATABASE <数据库名>; 例子: CREATE DATABASE IF NOT EXISTS RUNOOB DEFAULT CHAR ...
- MySQL(2)— 数据库的基本操作
二.数据库 2-1.操作数据库(了解) 1.创建数据库 CREATE DATABASE [IF NOT EXIST] myDatabase; 2.删除数据库 DROP DATABASE `myData ...
- PHP数组简单操作
1.数字索引数组 1.1创建一个数组 php中最常用的两个类型是:数组,字符串.数组也分为两种,一种是数字索引,一种是关键是索引,关键字索引有点像python中字典的意思.数字索引类型的数组的创建方法 ...
- js数组对象的一些常用方法
pop:删除数组最后一个元素 语法: array.pop(); 如 var array = ['1','2','3']; array.pop(); 返回结果:[‘1’,‘2’]此方法会改变数组的长度 ...
- Consul+upsync+Nginx实现动态负载均衡
上一篇文章 <C# HttpClient 使用 Consul 发现服务> 解决了内部服务之间的调用问题, 对外提供网关服务还没有解决, 最后我选择了 nginx-upsync-module ...
- LinkedList为什么增删快、查询慢
List家族中共两个常用的对象ArrayList和LinkedList,具有以下基本特征. ArrayList:长于随机访问元素,中间插入和移除元素比较慢,在插入时,必须创建空间并将它的所有引用向前移 ...
- pycharm激活码,亲测有效
PyCharm是由著名的JetBrains公司所打造的一款功能强大的Python IDE,它具有一般IDE都具备的功能, 并且使用起来非常方便好用.最近需求PyCharm激活码的网友非常多,就在这里给 ...