網站首頁 編程語言 正文
在上一篇文章中,我們講解了使用EF實現簡單的增刪改查,在這篇文章中我們使用實體的EntityState狀態來優化數據的增刪改查。
一、修改數據
上篇文章中的修改數據的方法是EF官方推薦的方式,即先查詢出來要修改的數據,然后在修改。但是這種操作會導致多次操作數據庫:
從上面的截圖中可以看出,查詢數據的時候會執行一次事物,修改的時候又執行了一次事物,即修改數據會操作兩次數據庫。那么有沒有什么方法可以只操作一次數據庫呢?那就是下面要講解的EntityState。
使用EntityState優化上面的修改方法:
static void EditAdvance() { using (StudentSystemEntities dbContext = new StudentSystemEntities()) { // 將EF執行的SQL語句輸出到控制臺 dbContext.Database.Log += p => Console.WriteLine(p); // 創建要修改的對象 Student stu = new Student() { StudentID = 14, Age = 690 }; // 通過上下文獲取對象相關信息 DbEntityEntryentry = dbContext.Entry (stu); // 對象的狀態是沒有修改 entry.State = System.Data.Entity.EntityState.Unchanged; // 對象的屬性值Age修改了 entry.Property("Age").IsModified = true; // 保存修改 會智能判斷哪個對象的哪個屬性值修改了 dbContext.SaveChanges(); Console.WriteLine("修改成功"); } }
結果:
從上面的截圖中不難看出,這次只操作了一次數據庫。
好處:只執行一次數據庫操作,不需要查詢了,體現了EF修改的本質(通過實體對象的狀態進行修改)。
二、刪除
static void DeleteAdvance() { using (StudentSystemEntities dbContext = new StudentSystemEntities()) { // 將EF執行的SQL語句輸出到控制臺 dbContext.Database.Log += p => Console.WriteLine(p); // 先查詢然后在刪除 Student stu = new Student() { StudentID = 14 }; DbEntityEntryentry = dbContext.Entry (stu); entry.State = System.Data.Entity.EntityState.Deleted; // 保存,智能判斷對象的狀態 dbContext.SaveChanges(); Console.WriteLine("刪除成功"); } }
結果:
三、新增數據
static void AddAdvance() { using (StudentSystemEntities dbContext = new StudentSystemEntities()) { // 定義Student對象 Student stu = new Student() { StudentName = "花千骨", Sex = "女", Age = 3422, Major = "舞蹈專業", Email = "2345678911@qq.com" }; // 將EF執行的SQL語句輸出到控制臺 dbContext.Database.Log += p => Console.WriteLine(p); DbEntityEntryentry = dbContext.Entry (stu); entry.State = System.Data.Entity.EntityState.Added; // 保存的數據庫 dbContext.SaveChanges(); Console.WriteLine("保存成功"); } }
四、批處理
利用EntityState可以很好的實現批處理功能,例如下面的例子:增加兩條數據,修改一條數據,刪除一條數據
static void Save() { using (StudentSystemEntities dbContext = new StudentSystemEntities()) { // 將EF執行的SQL語句輸出到控制臺 dbContext.Database.Log += p => Console.WriteLine(p); // 新增數據1 Student stu1 = new Student() { StudentName = "紅孩兒", Age = 456, Major = "冶金專業" }; dbContext.Students.Add(stu1); // 新增數據2 Student stu2 = new Student() { StudentName = "青牛精", Age = 345, Major = "煉丹" }; // 使用狀態 DbEntityEntryentry = dbContext.Entry (stu2); entry.State = System.Data.Entity.EntityState.Added; // 修改數據 Student stuEdit = new Student() { StudentID=5, Age=678 }; //狀態 DbEntityEntry entryEdit = dbContext.Entry (stuEdit); entryEdit.State = System.Data.Entity.EntityState.Unchanged; entryEdit.Property("Age").IsModified = true; // 刪除數據 Student stuDel = new Student() { StudentID=22 }; DbEntityEntry entryDel = dbContext.Entry (stuDel); entryDel.State = System.Data.Entity.EntityState.Deleted; // 保存 dbContext.SaveChanges(); Console.WriteLine("保存成功"); } }
使用EntityState實現批處理功能,只需要執行一次SaveChange()就可以了,如果是使用原來的方式就需要多次執行SaveChange(),這樣可以減少數據庫的操作。
總結:無論是add、remove、savechanges都是根據EF包裝實體的State進行相應的增刪改操作。
原文鏈接:https://www.cnblogs.com/dotnet261010/p/9085678.html
相關推薦
- 2022-07-26 繞過正則表達式例子
- 2022-11-12 Android手冊之Toolbar搜索聯動及監聽小技巧_Android
- 2022-06-08 并發編程--CountdownLatch && CyclicBarrier
- 2023-08-28 react antd常見報錯Each child in a list should have a u
- 2022-02-23 關于zabbix自定義監控項和觸發器問題_zabbix
- 2022-10-11 python嵌套try...except如何使用詳解_python
- 2023-01-19 Pycharm?2to3配置,python2轉python3方式_python
- 2022-06-22 Git常用命令匯總_其它綜合
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支