2012-12-18 57 views
1

我是比較新的,但我還是有點不好意思,因爲這確實應該是簡單...MVC 4,EF 5周的SaveChanges不更新數據庫

所有我想要做的就是更新數據庫表中的現有行。我先使用EF(5我相信)代碼。

對於MVC 3我用這個方法(它的工作):

ReportCommon reportcommon = db.ReportCommon.Single(r => r.ReportCommonId == id); 
reportcommon.IP = StaticUtilities.GetIPAddress(); 
db.ObjectStateManager.ChangeObjectState(reportcommon, EntityState.Modified); 
db.SaveChanges(); 

我已經試過了,我發現了幾個例子,雖然他們沒有錯誤的數據庫沒有更新。 ..

[HttpPost] 
public ActionResult Edit(CitizenEntryViewModel citizenDetails) 
    { 
     ActiveCitizen activeCitizen = db.ActiveCitizen.SingleOrDefault(m => m.ID == citizenDetails.ActiveCitizen.ID); 

     if (activeCitizen != null) 
     { 
      citizenDetails.ActiveCitizen.CitizenUpdatedRecordOn = DateTime.Now; 
      // Fields we don't edit but still need to pass back 
      citizenDetails.ActiveCitizen.PublicID = activeCitizen.PublicID; 
      citizenDetails.ActiveCitizen.IsKIN = activeCitizen.IsKIN; 
      activeCitizen = citizenDetails.ActiveCitizen; 
      db.SaveChanges(); 
     } 
+0

沒有需要手動將對象狀態更改爲'modified'。模型中的IP屬性是否正確鏈接到數據庫? – Silvermind

+0

您是否嘗試更改ori ginal'activeCitizen'對象的屬性並保存?或者在'db.SaveChanges();'之前調用'db.ObjectStateManager.ChangeObjectState(activeCitizen,EntityState.Modified);'' – Zabavsky

+0

謝謝。 Silvermind,第一個代碼示例是在一段時間後從MVC 3項目中獲得的。 Zabavsky,我嘗試了將狀態更改爲「修改」的方法,但我似乎無法訪問ObjectStateManager。 VS Express 2012說:'ActiveCitizenSystem.Models.ACSEntities'不包含ObjectStateManager的定義。我確實有命名空間條目:'using System.Data.Objects;' – ChrisCurrie

回答

4

我設法使用this SO post提到下面的代碼展示瞭如何只保存新的值來解決這個問題:

db.Entry(activeCitizen).CurrentValues.SetValues(citizenDetails.ActiveCitizen); 

請注意,我遇到了錯誤:「ObjectStateManager中已存在具有相同鍵的對象。該ObjectStateManager無法跟蹤多個對象使用相同的密鑰」

This SO post幫助我克服這個問題

最後的代碼,因此是:

var currentCitizen = db.ActiveCitizen.Find(citizenDetails.ActiveCitizen.ID); 
db.Entry(currentCitizen).CurrentValues.SetValues(citizenDetails.ActiveCitizen); 
db.SaveChanges(); 
0

嘗試這個

[HttpPost] 
public ActionResult Edit(CitizenEntryViewModel citizenDetails) 
{ 
    ActiveCitizen activeCitizen = db.ActiveCitizen.SingleOrDefault(m => m.ID == citizenDetails.ActiveCitizen.ID); 

    if (activeCitizen != null) 
    { 
     UpdateModel(activeCitizen); 
     db.SaveChanges(); 
    } 
+0

什麼是'UpdateModel'? – Zabavsky

+0

訪問Joe Stevens博客,瞭解更新模型的工作原理。 http://www.joe-stevens.com/2010/02/17/asp-net-mvc-using-controller-updatemodel-when-using-a-viewmodel/ – Niraj

+0

謝謝。我嘗試了'UpdateModel'方法,並收到以下錯誤:''ActiveCitizenSystemMimic.Models.ActiveCitizen'類型的模型無法更新'。我添加了一個可以在下面使用的方法。非常感謝。 – ChrisCurrie