【Entity Framework】EF中SaveChanges如何使用

【Entity Framework】EF中SaveChanges如何使用

文章目錄

  • 【Entity Framework】EF中SaveChanges如何使用
    • 一、概述
    • 二、更改跟蹤和SaveChanges
    • 三、SaveChanges優勢
    • 四、使用SaveChanges添加數據
    • 五、使用SaveChanges更新數據
    • 六、使用SaveChanges刪除數據
    • 七、單個SaveChanges中的多個操作
    • 八、備注

一、概述

雖然查詢允許從數據庫中讀取數據,但保存數據意味著向數據庫添加新實體,刪除實體或以某種方法修改現有實體的屬性。Entity Framework Core(EF Core)支持將數據保存到數據庫。

二、更改跟蹤和SaveChanges

在許多情況下,程序需要查詢數據庫中的某些數據,對其執行一些修改,并保存這些修改;這有時稱為“工作單元”。下面示例展示我們修改的博客標題屬性。在EF中,這通常按如下方式完成:

using(var context = new BloggingContext())
{var blog = context.Blogs.Single(b=>b.Title=="工蟻網絡科技有限公司");blog.Title ="數字工蟻";context.SaveChanges();
}

上述代碼執行一下步驟:

  1. 它使用常規LINQ查詢從數據庫加載實例。默認情況下跟蹤EF的查詢,這意味著EF在其內部更改跟蹤中跟蹤加載的實體。
  2. 通過分配.NET屬性來照常操作加載的實體實例。此步驟不涉及EF。
  3. 最后調用DbContext.SaveChanges()。此時,EF會自動檢測任何更改,方法是將實體與加載實體時的快照進行比較。檢測到任何更改都將保存到數據庫;使用關系數據庫時,這通常涉及發送SQL,UPDATE來更新相關行。

請注意,上面描述了現有數據的典型更新操作,但添加和刪除實體時遵循類似的原則。通過調用DbSet<TEntity>.AddRemove與EF的更改跟蹤器交互,從而跟蹤更改。然后,當調用SaveChanges()時,EF會將所有跟蹤的更改應用于數據庫。

三、SaveChanges優勢

  • 無需編寫代碼來跟蹤已更改的實體和屬性 - EF 會自動為你執行此操作,并且僅更新數據庫中的這些屬性,從而提高性能。 想象一下,如果加載的實體綁定到 UI 組件,允許用戶更改他們想要的任何屬性;EF 減輕了找出哪些實體和屬性實際已更改的負擔。
  • 保存對數據庫的更改有時可能很復雜! 例如,如果要添加一個博客并為該博客添加一些帖子,則可能需要為插入的博客提取數據庫生成的密鑰,然后才能插入帖子(因為它們需要引用博客)。 EF 為你完成所有這些操作,從而消除了復雜性。
  • EF 可以檢測并發問題。例如,當其他人在你的查詢和SaveChanges()之間修改了數據庫行時。并發沖突中提供了更多詳細信息。
  • 在支持它的數據庫中,SaveChanges()自動包裝事務中的多個更改,確保在發生故障時數據保存一致。
  • 在許多情況下,SaveChanges()還會對多個更改進行批處理,從而顯著減少數據庫往返次數并大幅提高性能。

四、使用SaveChanges添加數據

使用DbSet.Add方法添加實體類的新實例。調用DbContext.SaveChanges()時,數據將插入到數據庫中:

using (var context = new BloggingContext())
{var blog = new Blog { Title = "數字工蟻" };context.Blogs.Add(blog);context.SaveChanges();
}

Add、Attach和Update方法全部呈現在傳遞給這些方法的實體的完整關系圖上。此外,還可以使用EntityEntry.State屬性僅設置單個實體的狀態。如:context.Entry(blog).State = EntityState.Modified

五、使用SaveChanges更新數據

EF 將自動檢測對由上下文跟蹤的現有實體所做的更改。 這包括從數據庫加載/查詢的實體,以及之前添加并保存到數據庫的實體。

只需修改分配給屬性的是值,然后調用SaveChanges:

using(var context = new BloggingContext())
{var blog = context.Blogs.Single(b=>b.Title == "數字工蟻");blog.Title ="數字工蟻科技";context.SaveChanges();
}

六、使用SaveChanges刪除數據

使用DbSet<TEntity>.Remove方法刪除實體類的實例:

using(var context = new BloggingContext())
{var blog = context.Blogs.Single(b => b.Title == "數字工蟻");context.Blogs.Remove(blog);context.SaveChanges();
}

如果實體已在于數據庫中,則將在SaveChanges期間刪除該實體。如果實體尚未保存到數據庫,則在調用SaveChanges時,會從上下文中刪除該實體其不再插入它。

七、單個SaveChanges中的多個操作

可以將多個添加/更新/移除操作合并到對 SaveChanges 的單個調用中:

using (var context = new BloggingContext())
{// seeding databasecontext.Blogs.Add(new Blog { Url = "Goyeer數字" });context.Blogs.Add(new Blog { Url = "數字工蟻" });context.SaveChanges();
}using (var context = new BloggingContext())
{// addcontext.Blogs.Add(new Blog { Url = "Goyeer數字工蟻" });context.Blogs.Add(new Blog { Url = "工蟻數字中國" });// updatevar firstBlog = context.Blogs.First();firstBlog.Url = "";// removevar lastBlog = context.Blogs.OrderBy(e => e.BlogId).Last();context.Blogs.Remove(lastBlog);context.SaveChanges();
}

八、備注

對于大多數數據庫提供程序,SaveChanges是事務性的。這意味著所有操作要么成功要么失敗,絕不會部分應用這些操作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13238.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13238.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13238.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

roscore啟動報錯的解決方法【將環境變量配置于最后】

今天在啟動rviz時發生一個很奇怪的報錯&#xff1a; rviz: error while loading shared libraries: librviz.so: cannot open shared object file: No such file or directory 我感覺很納悶&#xff01;再試著啟動一下roscore&#xff0c;發現如下報錯&#xff1a; [rosout-1…

[muduo網絡庫]——使用muduo庫搭建Echo服務器(剖析muduo網絡庫核心部分、設計思想)

在此之前&#xff0c;我們對于muduo庫的每一類幾乎都進行了逐行的分析&#xff0c;但是一個網絡庫的每個模塊之間總是有千絲萬縷的關系&#xff0c;所以可能有的地方還是有分析的不到位&#xff0c;所以從這一篇開始&#xff0c;我們從muduo的簡單使用----搭建一個Echo服務器&a…

Python爬蟲從入門到精通:一篇涵蓋所有細節的高質量教程

目錄 第一部分&#xff1a;Python爬蟲基礎 1.1 爬蟲原理 1.2 Python爬蟲常用庫 1.3 爬蟲實戰案例 1.4 注意事項 第二部分&#xff1a;爬蟲進階技巧 2.1 處理動態加載的內容 2.2 登錄認證 2.3 分布式爬取 2.4 反爬蟲策略 第三部分&#xff1a;爬蟲實戰項目 3.1 豆瓣…

【C語言】指針(二)

目錄 一、傳值調用和傳址調用 二、數組名的理解 三、通過指針訪問數組 四、一維數組傳參的本質 五、指針數組 六、指針數組模擬實現二維數組 一、傳值調用和傳址調用 指針可以用在哪里呢&#xff1f;我們看下面一段代碼&#xff1a; #include <stdio.h>void Swap(i…

基于Spring封裝一個websocket工具類使用事件發布進行解耦和管理

最近工作中&#xff0c;需要將原先的Http請求換成WebSocket&#xff0c;故此需要使用到WebSocket與前端交互。故此這邊需要研究一下WebSocket到底有何優點和不可替代性&#xff1a; WebSocket優點&#xff1a; WebSocket 協議提供了一種在客戶端和服務器之間進行全雙工通信的…

如何在MATALB中調用libMR

? 因為個人項目原因,我曾將參考OpenMax源碼GitHub - abhijitbendale/OSDN: Code and data for the research paper “Towards Open Set Deep Networks” A Bendale, T Boult, CVPR 2016將其轉換到MATLAB使用。 OpenMax 使用極值理論實現對開放集的篩選,在計算得分時需要用l…

異地組網群暉不能訪問怎么辦?

在日常使用群暉網絡儲存設備時&#xff0c;我們常常會遇到無法訪問的情況&#xff0c;特別是在異地組網時。這個問題很常見&#xff0c;但也很讓人困擾。本文將針對異地組網群暉無法訪問的問題進行詳細解答和分析。 異地組網的問題 在異地組網中&#xff0c;群暉設備無法訪問的…

Unity | Spine動畫動態加載

一、準備工作 Spine插件及基本知識可查看這篇文章&#xff1a;Unity | Spine動畫記錄-CSDN博客 二、Spine資源動態加載 1.官方說明 官方文檔指出不建議這種操作。但spine-unity API允許在運行時從SkeletonDataAsset或甚至直接從三個導出的資產實例化SkeletonAnimation和Skel…

被耽誤了的發明家

高三的某一天&#xff0c;數學焦老師在黑板上推公式&#xff0c;突然花屁股&#xff08;見另一篇博文《數學老師們》&#xff09;上出現了一個光圈。我心里一樂&#xff0c;有人在玩鏡子。本來大家對于焦老師的花屁股已經司空見慣了&#xff0c;可以不受干擾地聽課&#xff0c;…

HNU-算法設計與分析-作業3

第三次作業【動態規劃】 文章目錄 第三次作業【動態規劃】<1>算法實現題 3-1 獨立任務最優解問題<2>算法實現題 3-4 數字三角形問題<3>算法實現題 3-8 最小m段和問題<4>算法實現題 3-25 m處理器問題 <1>算法實現題 3-1 獨立任務最優解問題 ▲問…

postgresql安裝及性能測試

postgresql安裝及性能測試 1. Postgresql介紹 Postgresql是一款功能強大的開源對象關系型數據庫管理系統&#xff08;ORDBMS&#xff09;&#xff0c;以其穩定性、擴展性和標準的SQL支持而聞名。它支持復雜查詢、外鍵、觸發器、視圖、事務完整性、多版本并發控制&#xff08;MV…

Linux(七) 動靜態庫

目錄 一、動靜態庫的概念 二、靜態庫的打包與使用 2.1 靜態庫的打包 2.2 靜態庫的使用 三、動態庫的打包與使用 3.1 動態庫的打包 3.2 動態庫的使用 3.3 運行動態庫的四種方法 四、總makefile 一、動靜態庫的概念 靜態庫&#xff1a; Linux下&#xff0c;以.a為后綴的…

Python專題:十五、JSON數據格式

Python的數據處理&#xff1a;JOSN 計算機的主要工作&#xff1a;處理數據 最容易處理的數據就是結構化數據 非結構化數據&#xff1a;視頻&#xff0c;文件等 近些年的大數據、數據挖掘就是對互聯網中的各種非結構化的數據的分析和處理 半結構化數據 明確的結構屬性&…

陪診服務運用預約小程序的效果是什么

在中高型城市里&#xff0c;陪診師近些年也很有熱度&#xff0c;已經衍生成為一個新的小眾行業&#xff0c;不同醫院/不同科目等其它情況針對不同群體往往很難完善&#xff0c;比如部分老年人腿腳不便、不認識字、外地語言難以溝通等&#xff0c;陪診師的作用就尤為凸顯. 對相…

[Bootloader][uboot]code總結

文章目錄 1、U_BOOT_DRIVER2、DM框架dm_scan_platdatadm_extended_scan_fdt 1、U_BOOT_DRIVER 使用這個宏可以定義一個驅動實例&#xff0c;宏定義是 其中使用的struct driver結構體 使用的ll_entry_declare宏定義是 歸結為 2、DM框架 1、 DM框架 DM模型抽象出了以下四個…

16.投影矩陣,最小二乘

文章目錄 1. 投影矩陣1.1 投影矩陣P1.2 投影向量 1. 投影矩陣 1.1 投影矩陣P 根據上節知識&#xff0c;我們知道當我們在解 A X b AXb AXb的時候&#xff0c;發現當向量b不在矩陣A的列空間的時候&#xff0c;我們希望的是通過投影&#xff0c;將向量b投影到矩陣A的列空間中&…

ModuleNotFoundError: No module named ‘sklearn‘

ModuleNotFoundError: No module named sklearn 解決辦法&#xff1a; pip install scikit-learn

7B2 PRO主題5.4.2免授權直接安裝

B2 PRO 5.4.2 最新免授權版不再需要改hosts&#xff0c;直接在wordpress上傳安裝即可

網站接入百度云防護CDN后回源率非常高原因

最近&#xff0c;有站長反饋網站接入百度云防護后&#xff0c;網站回源率非常高。 今天百度云來給大家講解下&#xff0c;CDN回源高的原因&#xff1a; 1.動態請求比較多 網站的動態請求很多&#xff0c;一般是回源率高的主要原因&#xff0c;因為CDN對待動態請求是每個請求…

Vue的學習 —— <網絡請求庫Axios>

目錄 前言 正文 一、Axios基本概念 二、安裝Axios 三、Axios使用方法 四、向服務器發送請求 前言 在之前的開發案例中&#xff0c;我們通常直接在組件中定義數據。但在實際的項目開發中&#xff0c;我們需要從服務器獲取數據。當其他用戶希望訪問我們自己編寫的網頁時&a…