When using UpdateModel with LINQ to Entities in ASP.NET MVC 2, "The model of type 'XYZ' could not be updated" (.NET 3.5)

asp.net-mvc-2 c# entity-framework

Question

I have a model set up using LINQ to Entities and have code working that adds to the database as expected. However, I can't get UpdateModel to work when I am using .NET 3.5.

[HttpPost]
public ActionResult Edit(Site.Models.XYZ xyz)
{
    try
    {
        var original = db.XYZ.First(u => u.id == xyz.id);
        UpdateModel(original);
        db.SaveChanges();

        return RedirectToAction("Index");
    }
    catch (Exception ex)
    {
        return View("Error");
    }
}

This results in the following exception:

System.InvalidOperationException was caught
  Message=The model of type 'Site.Models.XYZ' could not be updated.
  Source=System.Web.Mvc
  StackTrace:
       at System.Web.Mvc.Controller.UpdateModel[TModel](TModel model, String prefix, String[] includeProperties, String[] excludeProperties, IValueProvider valueProvider)
       at System.Web.Mvc.Controller.UpdateModel[TModel](TModel model, String prefix)
       at Site.Controllers.XYZController.Edit(Site.Models.XYZ xyz) in D:***.cs:line 81
  InnerException: 

If I do UpdateModel(xyz) the exception does not occur, but the data does not save either.

How can I get UpdateModel to work with this (without updating to .NET 4.0), why can't it be updated (exception is not helpful as there is no inner exception)?

1
8
9/24/2010 1:47:07 PM

Accepted Answer

Managed to solve the problem. Can be done in one of two ways:

TryUpdateModel(original)

or

db.ApplyPropertyChanges(original.EntityKey.EntitySetName, xyz)

No idea why TryUpdateModel will work but UpdateModel won't. Maybe just a bug in .NET 3.5.

13
9/24/2010 2:21:07 PM

Popular Answer

what I do in my MVC projects is grab the source code for the DefaultModelBinder from Codeplex and paste it into a new class in your project, like MyDefaultModelBinder. then register that model binder in your global.asax:

ModelBinders.Binders.DefaultBinder = new MyDefaultModelBinder();

this lets you set a breakpoint in the BindModel method, and you can figure out why it's not able to bind.



Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow