在使用EF框架時,我們通常都是通過調用SaveChanges方法把增加/修改/刪除的數據提交到數據庫,但是上下文是如何知道實體對象是增加、修改還是刪除呢?答案是通過EntityState的枚舉值來判斷的。也就是說在操作數據庫時,EF會根據EntityState這個枚舉檢測到實體的狀態,然后執行相應的增/刪/改操作。
在使用EF框架時,我們通常都是通過調用SaveChanges方法把增加/修改/刪除的數據提交到數據庫,但是上下文是如何知道實體對象是增加、修改還是刪除呢?答案是通過EntityState的枚舉值來判斷的。也就是說在操作數據庫時,EF會根據EntityState這個枚舉檢測到實體的狀態,然后執行相應的增/刪/改操作。
該狀態對應的值為以下五種:
Detached:對象存在,但未由對象服務跟蹤。在創建實體之后、但將其添加到對象上下文之前,該實體處於此狀態;
Unchanged:自對象加載到上下文中后,或自上次調用 System.Data.Objects.ObjectContext.SaveChanges() 方法后,此對象尚未經過修改;
Added:對象已添加到對象上下文,但尚未調用 System.Data.Objects.ObjectContext.SaveChanges() 方法;
Deleted:使用 System.Data.Objects.ObjectContext.DeleteObject(System.Object) 方法從對象上下文中刪除了對象;
Modified:對象已更改,但尚未調用 System.Data.Objects.ObjectContext.SaveChanges() 方法。
通過修改/刪除數據來檢驗一下該狀態值,幫助理解:
[HttpPost] public ActionResult Edit(TestDataDB testdatadb) { if (ModelState.IsValid) { Console.WriteLine(db.Entry(testdatadb).State); //枚舉值為Detached db.Entry(testdatadb).State = EntityState.Modified; Console.WriteLine(db.Entry(testdatadb).State); //枚舉值為Modified db.SaveChanges(); Console.WriteLine(db.Entry(testdatadb).State);//枚舉值為Unchanged return RedirectToAction("Index"); } return View(testdatadb); }
[HttpPost, ActionName("Delete")] public ActionResult DeleteConfirmed(int id) { TestDataDB testdatadb = db.TestDataDBS.Find(id); Console.WriteLine(db.Entry(testdatadb).State);//枚舉值為Unchanged db.TestDataDBS.Remove(testdatadb); Console.WriteLine(db.Entry(testdatadb).State);//枚舉值為Deleted db.SaveChanges(); Console.WriteLine(db.Entry(testdatadb).State);//枚舉值為Detached return RedirectToAction("Index"); }