在上一篇文章中,我們講解了使用EF實現簡單的增刪改成,在這篇文章中我們使用實體的EntityState狀態來優化數據的增刪改查。
一、修改數據
上篇文章中的修改數據的方法是EF官方推薦的方式,即先查詢出來要修改的數據,然后在修改。但是這種操作會導致多次操作數據庫:
從上面的截圖中可以看出,查詢數據的時候會執行一次事物,修改的時候又執行了一次事物,即修改數據會操作兩次數據庫。那么有沒有什么方法可以只操作一次數據庫呢?那就是下面要講解的EntityState。
使用EntityState優化上面的修改方法:
1 static void EditAdvance() 2 { 3 using (StudentSystemEntities dbContext = new StudentSystemEntities()) 4 { 5 // 將EF執行的SQL語句輸出到控制台 6 dbContext.Database.Log += p => Console.WriteLine(p); 7 // 創建要修改的對象 8 Student stu = new Student() 9 { 10 StudentID = 14, 11 Age = 690 12 }; 13 // 通過上下文獲取對象相關信息 14 DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu); 15 // 對象的狀態是沒有修改 16 entry.State = System.Data.Entity.EntityState.Unchanged; 17 // 對象的屬性值Age修改了 18 entry.Property("Age").IsModified = true; 19 // 保存修改 會智能判斷哪個對象的哪個屬性值修改了 20 dbContext.SaveChanges(); 21 Console.WriteLine("修改成功"); 22 } 23 }
結果:
從上面的截圖中不難看出,這次只操作了一次數據庫。
好處:只執行一次數據庫操作,不需要查詢了,體現了EF修改的本質(通過實體對象的狀態進行修改)。
二、刪除
1 static void DeleteAdvance() 2 { 3 using (StudentSystemEntities dbContext = new StudentSystemEntities()) 4 { 5 // 將EF執行的SQL語句輸出到控制台 6 dbContext.Database.Log += p => Console.WriteLine(p); 7 // 先查詢然后在刪除 8 Student stu = new Student() 9 { 10 StudentID = 14 11 }; 12 DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu); 13 entry.State = System.Data.Entity.EntityState.Deleted; 14 // 保存,智能判斷對象的狀態 15 dbContext.SaveChanges(); 16 Console.WriteLine("刪除成功"); 17 } 18 }
結果:
三、新增數據
1 static void AddAdvance() 2 { 3 using (StudentSystemEntities dbContext = new StudentSystemEntities()) 4 { 5 // 定義Student對象 6 Student stu = new Student() 7 { 8 StudentName = "花千骨", 9 Sex = "女", 10 Age = 3422, 11 Major = "舞蹈專業", 12 Email = "2345678911@qq.com" 13 }; 14 // 將EF執行的SQL語句輸出到控制台 15 dbContext.Database.Log += p => Console.WriteLine(p); 16 DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu); 17 entry.State = System.Data.Entity.EntityState.Added; 18 // 保存的數據庫 19 dbContext.SaveChanges(); 20 Console.WriteLine("保存成功"); 21 } 22 }
四、批處理
利用EntityState可以很好的實現批處理功能,例如下面的例子:增加兩條數據,修改一條數據,刪除一條數據
1 static void Save() 2 { 3 using (StudentSystemEntities dbContext = new StudentSystemEntities()) 4 { 5 // 將EF執行的SQL語句輸出到控制台 6 dbContext.Database.Log += p => Console.WriteLine(p); 7 // 新增數據1 8 Student stu1 = new Student() 9 { 10 StudentName = "紅孩兒", 11 Age = 456, 12 Major = "冶金專業" 13 }; 14 dbContext.Students.Add(stu1); 15 16 // 新增數據2 17 Student stu2 = new Student() 18 { 19 StudentName = "青牛精", 20 Age = 345, 21 Major = "煉丹" 22 }; 23 // 使用狀態 24 DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu2); 25 entry.State = System.Data.Entity.EntityState.Added; 26 27 // 修改數據 28 Student stuEdit = new Student() 29 { 30 StudentID=5, 31 Age=678 32 }; 33 //狀態 34 DbEntityEntry<Student> entryEdit = dbContext.Entry<Student>(stuEdit); 35 entryEdit.State = System.Data.Entity.EntityState.Unchanged; 36 entryEdit.Property("Age").IsModified = true; 37 38 // 刪除數據 39 Student stuDel = new Student() 40 { 41 StudentID=22 42 }; 43 DbEntityEntry<Student> entryDel = dbContext.Entry<Student>(stuDel); 44 entryDel.State = System.Data.Entity.EntityState.Deleted; 45 46 // 保存 47 dbContext.SaveChanges(); 48 Console.WriteLine("保存成功"); 49 } 50 }
使用EntityState實現批處理功能,只需要執行一次SaveChange()就可以了,如果是使用原來的方式就需要多次執行SaveChange(),這樣可以減少數據庫的操作。
總結:無論是add、remove、savechanges都是根據EF包裝實體的State進行相應的增刪改操作。