Entity?Framework根據(jù)實體的EntityState狀態(tài)實現(xiàn)增刪改查
在上一篇文章中,我們講解了使用EF實現(xiàn)簡單的增刪改查,在這篇文章中我們使用實體的EntityState狀態(tài)來優(yōu)化數(shù)據(jù)的增刪改查。
一、修改數(shù)據(jù)
上篇文章中的修改數(shù)據(jù)的方法是EF官方推薦的方式,即先查詢出來要修改的數(shù)據(jù),然后在修改。但是這種操作會導(dǎo)致多次操作數(shù)據(jù)庫:
從上面的截圖中可以看出,查詢數(shù)據(jù)的時候會執(zhí)行一次事物,修改的時候又執(zhí)行了一次事物,即修改數(shù)據(jù)會操作兩次數(shù)據(jù)庫。那么有沒有什么方法可以只操作一次數(shù)據(jù)庫呢?那就是下面要講解的EntityState。
使用EntityState優(yōu)化上面的修改方法:
static void EditAdvance() { using (StudentSystemEntities dbContext = new StudentSystemEntities()) { // 將EF執(zhí)行的SQL語句輸出到控制臺 dbContext.Database.Log += p => Console.WriteLine(p); // 創(chuàng)建要修改的對象 Student stu = new Student() { StudentID = 14, Age = 690 }; // 通過上下文獲取對象相關(guān)信息 DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu); // 對象的狀態(tài)是沒有修改 entry.State = System.Data.Entity.EntityState.Unchanged; // 對象的屬性值A(chǔ)ge修改了 entry.Property("Age").IsModified = true; // 保存修改 會智能判斷哪個對象的哪個屬性值修改了 dbContext.SaveChanges(); Console.WriteLine("修改成功"); } }
結(jié)果:
從上面的截圖中不難看出,這次只操作了一次數(shù)據(jù)庫。
好處:只執(zhí)行一次數(shù)據(jù)庫操作,不需要查詢了,體現(xiàn)了EF修改的本質(zhì)(通過實體對象的狀態(tài)進(jìn)行修改)。
二、刪除
static void DeleteAdvance() { using (StudentSystemEntities dbContext = new StudentSystemEntities()) { // 將EF執(zhí)行的SQL語句輸出到控制臺 dbContext.Database.Log += p => Console.WriteLine(p); // 先查詢?nèi)缓笤趧h除 Student stu = new Student() { StudentID = 14 }; DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu); entry.State = System.Data.Entity.EntityState.Deleted; // 保存,智能判斷對象的狀態(tài) dbContext.SaveChanges(); Console.WriteLine("刪除成功"); } }
結(jié)果:
三、新增數(shù)據(jù)
static void AddAdvance() { using (StudentSystemEntities dbContext = new StudentSystemEntities()) { // 定義Student對象 Student stu = new Student() { StudentName = "花千骨", Sex = "女", Age = 3422, Major = "舞蹈專業(yè)", Email = "2345678911@qq.com" }; // 將EF執(zhí)行的SQL語句輸出到控制臺 dbContext.Database.Log += p => Console.WriteLine(p); DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu); entry.State = System.Data.Entity.EntityState.Added; // 保存的數(shù)據(jù)庫 dbContext.SaveChanges(); Console.WriteLine("保存成功"); } }
四、批處理
利用EntityState可以很好的實現(xiàn)批處理功能,例如下面的例子:增加兩條數(shù)據(jù),修改一條數(shù)據(jù),刪除一條數(shù)據(jù)
static void Save() { using (StudentSystemEntities dbContext = new StudentSystemEntities()) { // 將EF執(zhí)行的SQL語句輸出到控制臺 dbContext.Database.Log += p => Console.WriteLine(p); // 新增數(shù)據(jù)1 Student stu1 = new Student() { StudentName = "紅孩兒", Age = 456, Major = "冶金專業(yè)" }; dbContext.Students.Add(stu1); // 新增數(shù)據(jù)2 Student stu2 = new Student() { StudentName = "青牛精", Age = 345, Major = "煉丹" }; // 使用狀態(tài) DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu2); entry.State = System.Data.Entity.EntityState.Added; // 修改數(shù)據(jù) Student stuEdit = new Student() { StudentID=5, Age=678 }; //狀態(tài) DbEntityEntry<Student> entryEdit = dbContext.Entry<Student>(stuEdit); entryEdit.State = System.Data.Entity.EntityState.Unchanged; entryEdit.Property("Age").IsModified = true; // 刪除數(shù)據(jù) Student stuDel = new Student() { StudentID=22 }; DbEntityEntry<Student> entryDel = dbContext.Entry<Student>(stuDel); entryDel.State = System.Data.Entity.EntityState.Deleted; // 保存 dbContext.SaveChanges(); Console.WriteLine("保存成功"); } }
使用EntityState實現(xiàn)批處理功能,只需要執(zhí)行一次SaveChange()就可以了,如果是使用原來的方式就需要多次執(zhí)行SaveChange(),這樣可以減少數(shù)據(jù)庫的操作。
總結(jié):無論是add、remove、savechanges都是根據(jù)EF包裝實體的State進(jìn)行相應(yīng)的增刪改操作。
以上所述是小編給大家介紹的Entity Framework根據(jù)實體的EntityState狀態(tài)實現(xiàn)增刪改查,希望對大家有所幫助。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
基于?.NET?6?的ASP.NET?Core啟動地址配置方法及優(yōu)先級順序
這篇文章主要介紹了ASP.NET?Core啟動地址配置方法及優(yōu)先級順序,?.NET?6?使用了最小?WEB?API,?配置方式已經(jīng)部分發(fā)生了變化,下面文章我們來看看具體的方法,需要的小伙伴可以參考一下2022-03-03.Net彈性和瞬態(tài)故障處理庫Polly實現(xiàn)執(zhí)行策略
這篇文章介紹了.Net彈性和瞬態(tài)故障處理庫Polly實現(xiàn)執(zhí)行策略的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06Asp.net Core 如何設(shè)置黑白名單(路由限制)
本文主要介紹了Asp.net Core 如何設(shè)置黑白名單(路由限制),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08在?.NET?中使用?FixedTimeEquals?應(yīng)對計時攻擊的例子
在計算機安全中,計時攻擊(Timing attack)是旁道攻擊 (Side-channel attack) 的一種,而旁道攻擊是根據(jù)計算機處理過程發(fā)出的信息進(jìn)行分析,這篇文章主要介紹了在?.NET?中使用?FixedTimeEquals?應(yīng)對計時攻擊,需要的朋友可以參考下2022-06-06DotNetCore深入了解之HttpClientFactory類詳解
這篇文章主要給大家介紹了關(guān)于DotNetCore深入了解之HttpClientFactory類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03asp.net用url重寫URLReWriter實現(xiàn)任意二級域名 新
最近有個朋友要做url重寫的東西,我?guī)退伺?回頭看當(dāng)年自己寫的那個文章,當(dāng)時以為自己寫的很容易理解.但現(xiàn)在再看卻覺得寫的不好.而今天百度了一下urlrewriter發(fā)現(xiàn)我這個文章竟然排第二.為了方便更多朋友,我再寫點東西補充下.2009-11-11為TextBox裝飾水印與(blur和focus)事件應(yīng)用
為了界面的美觀,有些時候可能需要為文本框(TextBox)裝飾個水?。凰袃煞N狀態(tài),一是blur和focus。因此,我們可以在Javascript寫兩個事件,感興趣的朋友可以了解下2013-01-01