• 关于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
  • 相关阅读:
    mahout in Action研读(1)-给用户推荐图书
    工作的时候用到spring返回xml view查到此文章亲测可用
    Result Maps、Auto-mapping、cache
    MyBatis构建sql时动态传入表名以及字段名
    How to Write a Spelling Corrector用java 写拼写检查器 Java实现 以备查验
    245. Shortest Word Distance III
    244. Shortest Word Distance II
    243. Shortest Word Distance
    148. Sort List
    23. Merge k Sorted Lists
  • 原文地址:https://www.cnblogs.com/hcyesdo/p/13059875.html
Copyright © 2020-2023  润新知