关于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中线程的生命周期,首先看一下下面这张较 ...
随机推荐
- 一篇文章教会你利用Python网络爬虫获取电影天堂视频下载链接
[一.项目背景] 相信大家都有一种头疼的体验,要下载电影特别费劲,对吧?要一部一部的下载,而且不能直观的知道最近电影更新的状态. 今天小编以电影天堂为例,带大家更直观的去看自己喜欢的电影,并且下载下来 ...
- Loadrunner中遇到Failed to connect to server[10061] connection refused错误
(1)run-time setting/browser emulation中,将simulate a new user on each iteration 选项去掉(默认是选中的). 重新运行一切正 ...
- vue 兄弟组件之间的传值
一. 子传父,父传子. 二. 1.兄弟之间传递数据需要借助于事件车,通过事件车的方式传递数据 2.创建一个Vue的实例,让各个兄弟共用同一个事件机制. 3.传递数据方,通过一个事件触发bus.$emi ...
- python selenium unittest Fixture(setUp/tearDown)笔记
Fixture用途: 1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现 2.测试用例的前置条件可以使用fixture实现 Fixture使用: ...
- HTTP及Web核心基础
1. HTTP服务重要基础 1.1 用户访问网站基本流程 (1)客户端从浏览器输入"www.baidu.com"网站地址,回车后,系统首先会查找系统本地的DNS缓存及hosts文件 ...
- python datetime 转timestamp
import datetime import time d1=datetime.date.today() t1=time.mktime(d1.timetuple()) d2=datetime.date ...
- 数据库设计三大范式 zt
from http://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html 为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定 ...
- HDU4315 Climbing the Hill
题目链接:https://cn.vjudge.net/problem/HDU-4315 知识点: 博弈论 题目大意: \(Alice\) 和 \(Bob\) 轮流指挥 \(N\) 个人爬山,这 \(N ...
- scipy.sparse的一些整理
一.scipy.sparse中七种稀疏矩阵类型 1.bsr_matrix:分块压缩稀疏行格式 介绍 BSR矩阵中的inptr列表的第i个元素与i+1个元素是储存第i行的数据的列索引以及数据的区间索引, ...
- Js 改变时间格式输出格式
朋友看到的方法,非js原生的 自己封装到 function date2str(x,y) { var z={y:x.getFullYear(),M:x.getMonth()+1,d:x.getDate( ...