EF直接更新數據(不需查詢)

EF中會爲每個 管理的 實體對象 創建一個代理包裝類對象,其中會跟蹤 實體對象 的狀態和每個屬性的狀態;

一、通常使用EF更新的方式,先查詢出要修改的數據,然後再修改新的值;實體對象被修改的屬性 在 代理包裝類對象裏 的對應屬性狀態會被修改記錄下修改狀態,等到調用SaveChanges時,EF會遍歷其管理的每個實體對象,並根據其 包裝類對象 的狀態,生成增刪改查sql語句並執行;
      此例中修改操作,會生成 修改的sql語句(注意:此處只爲修改過的屬性生成sql語句),最後執行。
      缺點:修改先還要查詢,難受~~~~

複製代碼
 1 //1.先查詢要修改的原數據
 2 Models.BlogArticle modelNew = db.BlogArticles.Where(a => a.AId == model.AId).FirstOrDefault();
 3 
 4 //2.設置修改後的值
 5 modelNew.ATitle = "新的數據";
 6 modelNew.AContent = "新的數據~~~~~~";
 7 modelNew.ACate = 12;
 8 
 9 //3.跟新到數據庫
10 db.SaveChanges();
複製代碼

二、爲避免先查詢數據庫,可以直接將 被修改的實體對象 添加到 EF中管理(此時爲附加狀態Attached),並手動設置其爲未修改狀態(Unchanged),同時設置被修改的實體對象 的 包裝類對象 對應屬性爲修改狀態。
     優點:修改前不需要查詢數據庫。

複製代碼
 1 //0.0創建修改的 實體對象
 2 Models.BlogArticle model = new BlogArticle();
 3 model.AId = 12;
 4 model.ATitle = "新的數據";
 5 model.AContent = "新的數據~~~~~";
 6 
 7 //0.1添加到EF管理容器中,並獲取 實體對象 的僞包裝類對象
 8 DbEntityEntry<Models.BlogArticle> entry = db.Entry<Models.BlogArticle>(model);
 9 
10 //**如果使用 Entry 附加 實體對象到數據容器中,則需要手動 設置 實體包裝類的對象 的 狀態爲 Unchanged**
11 //**如果使用 Attach 就不需要這句
12 entry.State = System.Data.EntityState.Unchanged;
13 
14 //0.2標識 實體對象 某些屬性 已經被修改了
15 entry.Property("ATitle").IsModified = true;
16 entry.Property("AContent").IsModified = true;
17 
18 //3.跟新到數據庫
19 db.SaveChanges();




實際上真正有用的只有這句話




DbEntityEntry<Company> entry = db.Entry<Company>(model);
 entry.State = System.Data.EntityState.Modified;
db.SaveChanges();

其中model爲傳入的提交model,裏面已經包含了值得情況下
發佈了22 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章