zoukankan      html  css  js  c++  java
  • 关于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(1);  
          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=1};
    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
  • 相关阅读:
    mac必备软件
    gradle下的第一个SpringMVC应用
    解决mac安装homebrew后报错-bash: brew: command not found
    IDEA Tomcat部署时war和war exploded区别以及平时踩得坑
    spring boot application.properties基本配置
    netty之LengthFieldBasedFrameDecoder解码器
    Github命令说明
    gradle多项目 svn依赖
    IDEA快捷键
    xeno 实时性能测试 系统时钟1秒100个tick再测试
  • 原文地址:https://www.cnblogs.com/hcyesdo/p/13059875.html
Copyright © 2011-2022 走看看