1. 程式人生 > >EF中的c增加、u修改、d刪除

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,也可以使用前兩種

總結

  1. 同一個DbContext上下文操作中使用事務保證操作完整性。
  2. 使用SavaChanged進行資料提交
  3. 資料提交時是根據實體(或者說是欄位)的EntityState狀態來進行相應的增加、刪除、修改操作的。可以直接修改其狀態,也可以通過Add、Attach、Remove修改其狀態

相關推薦

EFc增加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

天線座和聯結器SMAU.FLIPXIPEX

轉載自: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地址硬盤IDCPU序列號等系統信息

finall ipaddress reac 地址 computer mod urn aca rop public class Computer { public static string CpuID; //1.cpu序列號 pub

C#的方法傳參與switchif結構(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) 為多少