Moyen approprié de mettre à jour l’entité à partir du contrôleur Action d’édition?

Manette

J’ai d’abord essayé ceci:

[HttpPost] public ActionResult Edit(JournalEntry journalentry) { if (ModelState.IsValid) { db.Entry(journalentry).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index", new { id = journalentry.Journal.JournalId }); } return View(journalentry); } 

Une erreur a été SaveChanges() dans SaveChanges() :

Message d’erreur: “L’instruction de mise à jour, d’insertion ou de suppression du magasin a affecté un nombre inattendu de lignes (0). Les entités peuvent avoir été modifiées ou supprimées depuis le chargement des entités. Actualisez les entrées de ObjectStateManager.”

J’ai examiné l’entité journalentry et constaté que son journalEntryId était 0, mais que toutes les autres propriétés étaient correctement définies. Par conséquent, je l’ai changé en ceci:

 [HttpPost] public ActionResult Edit(int id, JournalEntry journalentry) { if (ModelState.IsValid) { journalentry.JournalEntryId = id; db.Entry(journalentry).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Index", new { id = journalentry.Journal.JournalId }); } return View(journalentry); } 

Tout visait à enregistrer correctement, mais est-ce la bonne façon de sauvegarder l’entité?

En fait, vous pouvez renommer la propriété JournalEntryId de votre modèle de vue JournalEntry en Id classeur de modèle par défaut la remplira automatiquement pour vous, de sorte que vous n’ayez pas à écrire la ligne suivante:

 journalentry.JournalEntryId = id; 

et votre premier extrait de code fonctionnera, car la propriété Id sera renseignée avec la valeur de la route.

Ou si, pour une raison quelconque, vous ne pouvez pas renommer la propriété sur votre modèle de vue (en fait, je connais la raison => vous n’utilisez aucun modèle de vue, mais vous transmettez vos entités de domaine directement à la vue, ce qui est mauvais, mais soumis à une autre question. ), vous pouvez utiliser un champ caché dans votre formulaire:

 @Html.HiddenFor(model => model.JournalEntryId) 

ou modifiez votre déclaration Html.BeginForm pour inclure le paramètre en tant qu’argument de chaîne de requête:

 @Html.BeginForm("Edit", "SomeController", new { JournalEntryId = Model.JournalEntryId }, FormMethod.Post) { ... }