简体   繁体   中英

Changes to DbContext not saved - MVC Entity framework

I have created a database and then an MVC solution using VisualStudio Exrpess 2013 for WEB and I created a ViewModel to display an Edit view with dropdown lists. The view model includes just the property 'parlists' of type PartnerList, which is the model representing the main table of the database, and 2 properties of type SelectList which I use to create the dropdown lists in the view. The code of the viewmodel is as follows:

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

In the controller I have the following code for the HttpGet edit method:

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

This code is working fine and the view is correctly displaying a form with the dropdown lists. I omit the view code as it is quite long and propably not relevant. So far so good. My Http Post Edit method, however, is not saving the changes to the database. The code is as follows:

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

As you can see I am passing the viewmodel (newParList) to the EditPost method and then I update it using TryUpdateModel. By stepping into the debugging process I can see that the database record newParList.parlists is correctly updated with the user input, however when the step db.SaveChanges() is executed the program redirects to the Index view without saving the changes to the database. I tried using Attach as suggested in some posts but I believe the attach step is already included in the line 'db.Entry(newParList.parlists).State = EntityState.Modified;' and that did not indeed solve the problem. I examined a lot of posts and tried different solutions but none of them worked so I would appreciate some help.

I suspect you're missing the context add or update. Here's an example of how I handle the creation of a new record.

For an update you would find the record first then save the changes.

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

I think I found the solution. I was not updating the correct entity. In my HttpPost Edit method I now replaced the following line:

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

with:

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

Now my entities HoldingsFile and RealGainFile are updated after SaveChages() is executed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM