未保存对DbContext的更改

我创建了一个数据库,然后使用VisualStudio Exrpess 2013 for WEB创建了一个MVC解决方案,并创建了一个ViewModel以显示带有下拉列表的编辑视图。 视图模型只包含PartnerList类型的属性“parlists”,它是表示数据库主表的模型,以及两个用于在视图中创建下拉列表的SelectList类型属性。 viewmodel的代码如下所示:

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

正如你所看到的,我将viewmodel(newParList)传递给EditPost方法,然后使用TryUpdateModel对其进行更新。 通过进入调试过程,我可以看到数据库记录newParList.parlists正确更新了用户输入,但是当执行db.SaveChanges()步时,程序将重定向到Index视图而不保存对数据库的更改。 我尝试使用附加建议在一些职位,但我相信附加步骤已包含在行'db.Entry(newParList.parlists).State = EntityState.Modified;' 这并没有确实解决问题。 我审查了很多帖子,并尝试了不同的解决方案,但没有一个工作,所以我希望得到一些帮助。


我怀疑你错过了上下文添加或更新。 以下是我如何处理创建新记录的示例。

对于更新,您可以先查找记录,然后保存更改。

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

我想我找到了解决方案。 我没有更新正确的实体。 在我的HttpPost编辑方法中,我现在替换了以下行:

                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()后更新。

链接地址: http://www.djcxy.com/p/33583.html

上一篇: Changes to DbContext not saved

下一篇: Entity Framework 6.1 Updating a Subset of a Record