Entity Framework應用:根據實體的EntityState狀態實現增刪改查


在上一篇文章中,我們講解了使用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進行相應的增刪改操作。


免責聲明!

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



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