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.”
- Comment filtrer toute la source de données sur une grid de kendo avec des données distantes virtualisées
- Mappage du rôle de la collection en double nHibernate – Lorsque vous essayez de créer un mappage – plusieurs
- Pourquoi la cartographie ne fonctionne pas avec Entity Framework dans Visual Studio 2015 Professional
- Les actions enfants ne sont pas autorisées à effectuer des actions de redirection. (Utilisation de PartialViews)
- Utilisation de variable non affectée?
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) { ... }