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();

嘴拙:見笑了~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM