ASP.NET MVC 2 - "Le modèle de type 'XYZ' n'a pas pu être mis à jour" lors de l'utilisation de UpdateModel et de LINQ to Entities (.NET 3.5)

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

Question

J'ai un modèle mis en place en utilisant LINQ to Entities et le code fonctionne qui ajoute à la base de données comme prévu. Cependant, je ne parviens pas à faire fonctionner UpdateModel lorsque j'utilise .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");
    }
}

Cela entraîne l'exception suivante:

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: 

Si je fais UpdateModel(xyz) l'exception ne se produit pas, mais les données n'enregistrent pas non plus.

Comment puis-je faire en sorte que UpdateModel fonctionne avec cela (sans la mise à jour vers .NET 4.0), pourquoi ne peut-il pas être mis à jour (une exception n'est pas utile car il n'y a pas d'exception interne)?

Réponse acceptée

Géré pour résoudre le problème. Peut être fait de deux manières:

TryUpdateModel(original)

ou

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

Aucune idée pourquoi TryUpdateModel fonctionnera, mais pas UpdateModel . Peut-être juste un bogue dans .NET 3.5.


Réponse populaire

Ce que je fais dans mes projets MVC, c'est d'extraire le code source de DefaultModelBinder de Codeplex et de le coller dans une nouvelle classe de votre projet, comme MyDefaultModelBinder. puis enregistrez ce modèle dans votre global.asax:

ModelBinders.Binders.DefaultBinder = new MyDefaultModelBinder();

Cela vous permet de définir un point d'arrêt dans la méthode BindModel et de comprendre pourquoi il n'est pas capable de se lier.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow