關於EF的五種狀態
- 2020 年 6 月 7 日
- 筆記
- ASP.NET MVC
最近半個多月沒更新原因是在趕項目。。。在做項目的時候就會發現自己很多問題,也有很多東西要記錄,今天就記錄一下對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