關於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