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,裏面已經包含了值得情況下