2014-09-26 80 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