最近半个多月没更新原因是在赶项目。。。在做项目的时候就会发现自己很多问题,也有很多东西要记录,今天就记录一下对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(游离态),此时数据库数据已经没有了,但是这个对象还存在。

举个栗子:

  1. using(Context db=new Context)
  2. {
  3. var type= db.Book.Find();
  4. Console.WriteLine(db.Entry(type).State); //此时只是从数据库取出来,所以状态应该是Unchanged持久态
  5. db.Book.Remove(type);
  6. Console.WriteLine(db.Entry(type).State); //此时调用Remove()状态,还没有保存之前,应该是Deleted
  7. db.SaveChanges();
  8. Console.WriteLine(db.Entry(type).State); //调用SaveChanges()方法之后,此时状态应该是回到Detached游离态,这个时候彻底的和数据库没有关系了
  9. }

实际上在做删除的时候可以不需要从数据库中查一次,这样也是减少了sql语句的执行,性能也会相应的提高,但是这个方法也是比较笨重。

  1. var type=new Models.Book(){Id=};
  2. Console.WriteLine(db.Entry(type).State); //此时new了一下和数据库无关所以状态是Detached
  3. db.Entry(type).State=System.Data.Entity.EntityState.Unchanged; //欺骗服务器,不经过数据库直接改状态
  4. db.Book.Remove(type);
  5. Console.WriteLine(db.Entity(type).State); //Remove()后,此时状态应该是Deleted
  6. db.SaveChanges();
  7. Console.WriteLine(db.Entity(type).State); //此时状态又回到了Detached

关于EF的五种状态的更多相关文章

  1. 细说进程五种状态的生老病死——双胞胎兄弟Java线程

    java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...

  2. ios应运程序的五种状态

    ios应运程序的五种状态即转化  从apple的官方文档扣下来的 5状态: Not running The app has not been launched or was running but w ...

  3. jsp页面加载readyState的五种状态根据我们状态添加进度条

    这段代码放在页面最下面 原文如下: document.onreadystatechange = subSomething;//当页面加载状态改变的时候执行这个方法. function subSomet ...

  4. 转 XMLHttpRequest().readyState的五种状态详解

    转 http://javathinker.blog.ccidnet.com/blog-htm-itemid-1262479-do-showone-type-blog-uid-36384.html 在& ...

  5. Js--AJAX的小知识(一):ajax的五种状态

    一.ajax的五种状态(readyState ) 0 - (未初始化)还没有调用send()方法 1 - (载入)已调用send()方法,正在发送请求 2 - (载入完成)send()方法执行完成,已 ...

  6. ServiceWork的五种状态

    [ServiceWork的五种状态] installing.installed.activating.activated.redundant 参考:https://developer.mozilla. ...

  7. java线程五种状态

    java线程五种状态: 创建 -> 就绪 -> 运行 -> 销毁 创建 -> 就绪 -> 运行 -> 等待(缺少资源) -> 销毁 下图:各种状态转换

  8. Java 多线程 线程的五种状态,线程 Sleep, Wait, notify, notifyAll

    一.先来看看Thread类里面都有哪几种状态,在Thread.class中可以找到这个枚举,它定义了线程的相关状态: public enum State { NEW, RUNNABLE, BLOCKE ...

  9. Thread之一:线程生命周期及五种状态

    <Thread之一:线程生命周期及五种状态> <juc线程池原理(四): 线程池状态介绍> 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较 ...

随机推荐

  1. 自建nodejs服务器(一:有个服务器)

    之前在阿里云备案过,也买过域名和虚拟主机(6元一年),可惜虚拟主机虽然说可选linux或windows系统,但linux系统只支持几个php程序,一番折腾,云栖社区的大伙们都说要弄node得买个ECS ...

  2. LSTM的备胎,用卷积处理时间序列——TCN与因果卷积(理论+Python实践)

    什么是TCN TCN全称Temporal Convolutional Network,时序卷积网络,是在2018年提出的一个卷积模型,但是可以用来处理时间序列. 卷积如何处理时间序列 时间序列预测,最 ...

  3. 干货分享:如何使用Kubernetes的Ingress API

    您可以通过使用诸如Kong for Kubernetes的Ingress控制器(使用自定义资源定义并提供许多插件)来极大地扩展Ingress资源的功能. Kubernetes正在整个技术行业中得到采用 ...

  4. codeforce 436 D贪心思维题Make a Permutation!

    D. Make a Permutation! time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  5. poj3177 无向连通图加多少条边变成边双连通图

    Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15752   Accepted: 6609 ...

  6. swiper插件在移动端,多个swiper左右滑动时有空白的问题

    之前在项目上用到了多个swiper.但是结构结构代码css.以及js  几乎一样的除了第一个swiper左右滑动有回弹.其他都没有回弹.于是尝试了各种方法都不行. 百思不得其解 ,最后在官网终于找到了 ...

  7. python基础:list与string互转

    数据清洗必备技能 https://www.cnblogs.com/yaner2018/p/11162630.html

  8. getcomputedstyle和style的区别

    1.只读与可写getComputedStyle方法是只读的,只能获取样式,不能设置:而element.style能读能写,能屈能伸.2.获取的对象范围getComputedStyle方法获取的是最终应 ...

  9. LeetCode DFS搜索与回溯专题

    DFS + 回溯专题 17. 电话号码的字母组合 迭代也可以实现搜索 循环改写dfs搜索的写法: 例如 C++写法 class Solution { public: vector<string& ...

  10. Golang源码学习:调度逻辑(四)系统调用

    Linux系统调用 概念:系统调用为用户态进程提供了硬件的抽象接口.并且是用户空间访问内核的唯一手段,除异常和陷入外,它们是内核唯一的合法入口.保证系统的安全和稳定. 调用号:在Linux中,每个系统 ...