關於EF框架EntityState的幾種狀態


在使用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");
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM