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