2014-09-26 114 views
0

我創建了一個數據庫,然後使用VisualStudio Exrpess 2013用於WEB,並創建了一個MVC解決方案,並創建了一個ViewModel以顯示帶有下拉列表的編輯視圖。 視圖模型只包含PartnerList類型的屬性'parlists',它是代表數據庫主表的模型,以及2個用於在視圖中創建下拉列表的SelectList類型屬性。 的視圖模型的代碼如下:對DbContext的更改未保存 - MVC實體框架

public class FileStatusEdit 
{ 
    public SelectList HoldingsStatus { get; set; } 
    public SelectList RealGainStatus { get; set; } 
    public PartnerList parlists { get; set; } 
} 

在控制器我對HTTPGET編輯方法以下代碼:

public ActionResult Edit(int? id) 
    { 
     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     var viewModel = new FileStatusEdit 
     { 
      HoldingsStatus = new SelectList(db.Statuses, "Status_ID", "Status1", db.PartnerLists.Where(p => p.IntermediaryID == id).Single().AssetDataSource.HoldingsFile.Status_ID), 
      RealGainStatus = new SelectList(db.Statuses, "Status_ID", "Status1", db.PartnerLists.Where(p => p.IntermediaryID == id).Single().AssetDataSource.RealGainFile.Status_ID), 
      parlists = db.PartnerLists 
      .Include(p => p.AssetDataSource) 
      .Where(p => p.IntermediaryID == id) 
      .Single() 
     }; 
     if (viewModel.parlists == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(viewModel); 
    } 

此代碼工作正常和視圖被正確地顯示形式與下拉列表。我忽略了視圖代碼,因爲它很長,並且顯然不相關。 目前爲止這麼好。 但是,我的Http Post編輯方法沒有將更改保存到數據庫。代碼如下:

[HttpPost, ActionName("Edit")] 
    [ValidateAntiForgeryToken] 
    public ActionResult EditPost(FileStatusEdit newParList) 

    { 
     if (TryUpdateModel(newParList.parlists, "", 
      new string[] { "Firstname", "Surname", "Category", "ClientID", "IntermediaryID", "ExternalRef", "RecordStatus", "Asset_Data_Source_ID", "New_Communication_Issued", "AssetDataSource", "HoldingsFile", "RealGainFile"})) 

     { 
      try 
      { 
       db.Entry(newParList.parlists).State = EntityState.Modified; 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
      catch (RetryLimitExceededException) 
      { 
       ModelState.AddModelError("", "Unable to save changes."); 
      } 
     } 
     return View(newParList); 
    } 

正如你可以看到我傳遞的視圖模型(newParList)到EditPost方法,然後我用TryUpdateModel更新。通過進入調試過程,我可以看到數據庫記錄newParList.parlists正確更新了用戶輸入,但是當執行db.SaveChanges()步時,程序將重定向到Index視圖而不保存對數據庫的更改。 我試着使用附加建議在一些職位,但我相信附加步驟已經包含在行'db.Entry(newParList.parlists).State = EntityState.Modified;'這並沒有確實解決問題。 我檢查了很多帖子,並嘗試了不同的解決方案,但他們都沒有工作,所以我希望得到一些幫助。

回答

0

我想我找到了解決方案。我沒有更新正確的實體。 在我HttpPost Edit方法我現在換成下面一行:

   db.Entry(newParList.parlists).State = EntityState.Modified; 

有:

   db.Entry(newParList.parlists.AssetDataSource.HoldingsFile).State = EntityState.Modified; 
       db.Entry(newParList.parlists.AssetDataSource.RealGainFile).State = EntityState.Modified; 

現在我的實體HoldingsFile和RealGainFile被SaveChages後更新()被執行。

0

我懷疑你缺少上下文添加或更新。 下面是我如何處理創建新記錄的示例。

對於更新,您會首先找到該記錄,然後保存更改。

public void SaveCreatedMessage(Message message) 
    { 
     var dbEntry = _context.Message.Add(message); 
     if (dbEntry != null) 
     { 
      // Create the new record 
      dbEntry.CustomerID = message.CustomerID; 
      dbEntry.MessageID = message.MessageID; 
      dbEntry.Description = message.Description; 
      dbEntry.Text = message.Text; 
      dbEntry.IsRead = message.IsRead; 
      dbEntry.CreatedOn = message.CreatedOn; 
      dbEntry.CreatedBy = message.CreatedBy; 

      _context.Message.Add(message); 
     } 

     _context.SaveChanges(); 
    } 
+0

謝謝你的建議。我找到了解決方案,並將其發佈爲我的問題的答案。 – UbuntuDude 2014-09-27 09:58:31

+0

我剛剛發現,如果你創建了一個不完整的記錄,即丟失了外鍵,而不是拋出一個驗證錯誤,它只是跳過保存的記錄,所以當一切看起來成功時,沒有任何東西被保存 – MikeT 2016-06-28 10:30:21