EF中的c增加、u修改、d刪除
前言
初識EF操作資料庫,雖然看了資料會用但是有些懵懂,閒下來仔細瞭解,才算真正懂得這是怎麼一回事。
r(查詢)比較簡單,就不再多說。
正文
DbContext:一個數據上下文
我們在EF中例項化一個繼承自DbContext的上下文,這個上下文包含很多DbSet成員。我想說的是,對於同一個上下文,當其交使用SavaChanged方法互資料庫時會把所有操作包含在一個事務內,事務的作用就是為了保證所有sql執行成功的,不成功則回滾。所以你在執行多個操作時大可放心不全部成功執行的問題。如:
db.UserInfo.Add(user);
db.User.Add(user);
db.SaveChanges ();
這裡我有一個需求:當用戶註冊時向兩個表中插入資料,一個是使用者基本資訊表一個是使用者的具體資訊表。必須同時插入成功,不能出現一個表成功插入另一個表失敗的情況,這個時候放心使用SavaChanged吧。
SavaChanged():一個數據提交方式
SavaChanged()用於提交資料。db.SavaChanged()返回值是資料庫中有幾條資料被影響,所以你可以用db.SavaChanged()>0來判斷是否成功的插入、修改、刪除了資料。
EntityState:5個狀態值
當SavaChanged()方法執行期間,他會檢視當前Entity的EntityState的值,決定是去新增(Added)、修改(Modified)、刪除(Deleted)、什麼也不做。
如:
db.Entry(userinfo).State = EntityState.Added;
開啟EntityState
Detached,當前實體沒有存在於dbContext(資料庫)中
Unchanged,當前實體屬性值沒有發生改變
Added,標記為增加狀態,下次saveChange將新增到資料庫中
Deleted,標記刪除狀態,下次saveChange將刪除
Modified,標記為更改狀態,下次將更新
對於Detached:
UserInfo userinfo = new UserInfo();
EntityState userinfoState2 = db.Entry (userinfo).State;
這裡userinfo 和db沒有任何關係,所以userinfoState2值是Detached。
3個EF方法
Attach是連線,可以看成從資料庫讀取出了實體(但沒有操作資料庫)
Add,其實也就是將實體狀態改為added。
remove,所操作的實體不能是Detached狀態(也就是說實體必須存在於db中)
對於Attach:
Attach,執行下面程式碼看下資料庫sql語句:
UserInfo userinfo6 = new UserInfo();
userinfo6.ID = 4;
db.UserInfo.Attach(userinfo6);
Console.WriteLine(db.Entry(userinfo6).State);
資料庫監視器並沒有監視到sql,所以Attach是不操作資料庫的。當savechange時才會操作生成sql互動資料庫。
注意:Attach後的實體狀態是Unchanged。當你想要修改(modified)和刪除(remove)資料,必須修改實體狀態。
CUD操作
增加
// 第一種方式,建議使用
UserInfo userinfo=new UserInfo(){ Name="蘇軾"};
db.UserInfo.Add(userinfo);
db.SavaChanged();
// 第二種方式:設定狀態state
db.Entry(userinfo).State = EntityState.Added;
db.SavaChanged();
注意:SavaChanged()時會進行資料回撥,以便你在進行增加(或修改)後可以馬上取到資料進行使用。假如你資料庫的id是自增的,上面增加成功後userinfo的id就被賦予了資料庫的值。這是很有用的,比如使用者上傳了檔案後要返回檔案id的情境。
修改
// 先查再改,資料庫操作兩次,不建議
UserInfo userinfo = db.UserInfo.FirstOrDefault(u => u.ID == 1);
userinfo.Name = "蘇軾";
db.SavaChanged();
// 第二種方式,使用Attach,資料庫操作一次,建議
UserInfo userinfo = new UserInfo() { ID = 1,Name = "蘇軾" };
db.UserInfo.Attach(userinfo);
db.SavaChanged();
// 第三種,直接設定實體狀態,資料庫操作一次,建議
UserInfo userinfo4 = new UserInfo(){ ID = 1,Name = "蘇軾" };
db.Entry(userinfo4).State = System.Data.Entity.EntityState.Modified;
db.SavaChanged();
上面幾種都會修改實體的所有欄位並不靈活,有時候需求是隻需要修改其中一兩個欄位而已,怎麼辦呢?我們可以分別設定欄位的IsModified值來控制欄位是否是可修改的。以Attach方式為例:
UserInfo userinfo = new UserInfo() { ID = 1,Name = "蘇軾" };
db.UserInfo.Attach(userinfo);
db.Entry(userinfo4).Property("Sex").IsModified = false;
db.Entry(userinfo4).Property("Name").IsModified = true;
// 這裡我們還可以使用lambda
db.Entry(model).Property(u => u.Status).IsModified = false;
db.SavaChanged();
上面的程式碼,不會修改Sex、Name、Status的值,這種方式對於避免了不必要的欄位修改。
刪除
// 第一種,remove
db.UserInfo.Attach(userinfo6);
db.UserInfo.Remove(userinfo6);
db.SavaChanged();
// 第二種,設定狀態
db.Entry(userinfo6).State = EntityState.Deleted;
db.SavaChanged();
// 第三種,先查出來再改,這是微軟推薦方法,因為上兩種,不管附加還是設定狀態,資料庫不存在這個實體程式就會報錯
UserInfo userinfo6 = db.UserInfo.FirstOrDefault(u => u.ID == 1);
if (userinfo6 != null)
db.UserInfo.Remove(userinfo6);
當你如果你確定這個資料在資料庫中存在,用前兩種方式的確是最好的,假如你進行了異常檢測如使用了try-catch,也可以使用前兩種
總結
- 同一個DbContext上下文操作中使用事務保證操作完整性。
- 使用SavaChanged進行資料提交
- 資料提交時是根據實體(或者說是欄位)的EntityState狀態來進行相應的增加、刪除、修改操作的。可以直接修改其狀態,也可以通過Add、Attach、Remove修改其狀態
相關推薦
EF中的c增加、u修改、d刪除
前言 初識EF操作資料庫,雖然看了資料會用但是有些懵懂,閒下來仔細瞭解,才算真正懂得這是怎麼一回事。 r(查詢)比較簡單,就不再多說。 正文 DbContext:一個數據上下文 我們在EF中例項化一個繼承自DbContext的上下文,
ASP.NET頁面中動態增加的控制元件、新增事件
/--------------------------利用計數器實現動態button的累加---------------------------------/ 在ASP.NET中動態建立一個控制元件總是不那麼順利,特別是當對頁面的Life Cycle不是那麼瞭然的
GIT版本回退、工作區和暫存區、管理修改、提交修改、撤銷修改、刪除檔案
git status命令可以讓我們時刻掌握倉庫當前的狀態。比如哪個檔案被修改過,並且是否提交過。 git diff具體檔名.字尾名命令可以檢視某個檔案修改前後的區別,顯示的格式正是Unix通用的diff格式。 版本回退: 版本回退是有條件的,就是你還沒有把自己的本地版本
Git學習筆記3——修改檔案、檢視修改、提交修改
修改檔案 我們已經成功地新增並提交了一個readme.txt檔案,現在,是時候繼續工作了,於是,我們繼續修改readme.txt檔案,改成如下內容: Git is a distributed version control system. Git is a fr
天線座和聯結器SMA、U.FL、IPX、IPEX
轉載自:https://blog.csdn.net/zoomdy/article/details/80475143 NB-IoT常用的天線座有SMA、U.FL。U.FL也叫IPX或IPEX。SMA連線頭包括四種:內螺內針、外螺內孔、內螺內孔、外螺內針。 SMA座 常用的SMA座,外螺
XML讀取、XML修改、XML刪除
第一種:單獨寫一個XML類 XMLHelper類 using System; using System.Collections.Generic; using System.Text; using System.Xml; namespace DZ.DAL { pub
SourceInsight下載、安裝、破解、主題修改、其他配置全過程
SourceInsight下載、安裝、破解、主題修改全過程 SourceInsight4.0官網下載 SourceInsight4.0破解 1,下載sourceinsight4.exe檔案,替換安裝資料夾下的sourceinsight4.e
Subversion的檢視改動歷史、放棄修改、反向合併
提交改動:首先更新svnupdate,發現問題,解決之後執行自動測試工具,測試完成後再提交程式碼,並且注意一定要附上註釋資訊svn commit –m “message”。這裡需要注意註釋資訊不是你修改的什麼,而是為什麼這麼修改。因為修改了什麼很容易通過di
MongoDB .Net Driver(C#驅動) - 內嵌數組/嵌入文檔的操作(增加、刪除、修改、查詢(Linq 分頁))
odbc article err native linq protocol remove mit 實體類 目錄 一、前言 (一) 運行環境 二、前期準備工作 (一) 創建 MongoDBContext MongoDb操作上下文類 (二)創建測試類 (三) 創建測試代碼
C# 選擇檔案、選擇資料夾、開啟檔案(或者資料夾) 路徑中獲取檔案全路徑、目錄、副檔名、檔名稱 追加、拷貝、刪除、移動檔案、建立目錄 修改檔名、資料夾名!!
https://www.cnblogs.com/zhlziliaoku/p/5241097.html 1、選擇檔案用OpenDialog OpenFileDialog dialog = new OpenFileDialog(); dialog.Multiselect = true;/
C#對DataGridView中的資料進行新增、修改、刪除操作c#操作datatable
1.建立表 DataSet ds=new DataSet(); DataTable dt=new DataTable("User"); ds.Add(dt); dt.Columns.Add("user_name",typeof(string)); dt.Columns.Ad
用c語言實現 一個通訊錄(實現 增加、刪除、查詢、修改、顯示、清空功能)
源程式標頭檔案contact.h #ifndef _CONTACT_H__ #define _CONTACT_H__ #define NAME_MAX 20 #define SEX_MAX 5 #define TELE_MAX 15 #define ADDR_MAX 5
PostgreSQL的jsonb型別中包含陣列的 增加、遍歷、查詢、修改
Postgresql 版本 :9.5表結構CREATE TABLE person(id serial, info jsonb);JSONB結構[{"num":"學號","name":"姓名","score":"成績"}, {"num":"學號","name":"姓名","sc
C#實現對SQL資料庫中的表的查詢、新增、修改、刪除資料
經常用到的物件有:SqlConnection,SqlAdapter,SqlCommand、Dataset、DataGrid和DataReader等,以SqlConnection,SqlAdapter,SqlCommand、Dataset、DataGrid物件,操作SQL的例
c#中如何獲取本機MAC地址、IP地址、硬盤ID、CPU序列號等系統信息
finall ipaddress reac 地址 computer mod urn aca rop public class Computer { public static string CpuID; //1.cpu序列號 pub
C#中的方法傳參與switch、if結構(4)
判斷 1.2 菱形 條件表達式 執行 代碼 輸出 分類 簡易 一、方法傳參的2種方式 1、按值傳遞 傳遞的是值的副本,值會更改但未保留,值最終並未更改 2、按引用傳遞(形參用ref關鍵字修飾)【P86頁】 傳遞的是地址,值會更改且保留,值最終更改
DOM4j解析、修改、刪除、增加、保存XML的方法
exceptio set null 增加 gb2 itl str owin chang //XML文件 <?xml version="1.0" encoding="gb2312"?> <PhoneInfo> <Brand name="華為
u-boot移植(四)---代碼修改---時鐘修改、SDRAM
port write 啟動 tro nor ble 大小 pro 正常 最開始已經建立了新單板以及配置文件,現在就需要做的是代碼的修改,配置成適合目標板使用的u-boot。 一、時鐘修改 在代碼流程分析中,我們知道,系統的啟動是: 設置 CPU 為管理員模式 關閉
在AndroidManifest(清單文件)中註冊activity(活動)及配置主活動、更改App圖標、App名稱、修改隱藏標題欄
雙擊 建議 nba cat ima manager ram spa src 打開app/src/main/AndroidManifest。 1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xm
C/C++中,空數組、空類、類中空數組的解析及其作用
class 不同 理解 返回 free 而且 解析 分配 空類 轉自:http://blog.sina.com.cn/s/blog_93b45b0f01015s95.html 我們經常會遇到這些問題: (1)C++中定義一個空類,他們它的大小(sizeof) 為多少