L'impossibilité de modifier db entrées à l'aide de EFCore, EntityState.Modifié: “opération de Base de données devrait avoir sur 1 ligne(s) mais en fait affecté 0 ligne(s).”
Je suis en utilisant l'Identité de Base 1.0 ASP.NET MVC Core 1.0 et Entity Framework Core 1.0 pour créer un utilisateur simple système d'enregistrement avec cet article comme un point de départ, et je suis en train d'ajouter des rôles d'utilisateur. Je peux ajouter des rôles d'utilisateur, mais je ne suis pas en mesure de les modifier. Voici la Edit
action dans le RolesController
:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Edit(IdentityRole role)
{
try
{
_db.Roles.Attach(role);
_db.Entry(role).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
_db.SaveChanges();
return RedirectToAction("Index");
}
catch (Exception ex)
{
Console.WriteLine(ex);
return View();
}
}
Voici le formulaire dans la vue correspondante:
@model Microsoft.AspNet.Identity.EntityFramework.IdentityRole
@{
ViewBag.Title = "Edit";
}
<h2>Edit Role</h2>
<hr />
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.Id)
<div>Role name</div>
<p>@Html.TextBoxFor(model => model.Name)</p>
<input type="submit" value="Save" />
}
Le nouveau nom de rôle n'est pas enregistrer dans la base de données, et j'obtiens l'exception suivante: Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded.
J'ai été en mesure d'utiliser ce code exact (avec le Microsoft.AspNet.Identity.EntityFramework
de dépendance au lieu de EntityFrameworkCore
) pour modifier les entrées de base de données à l'aide de EF 7, de l'Identité 3, etc.
Des idées sur pourquoi ce code ne sera pas permettre à la base de données entrées-elle être modifiée?
OriginalL'auteur jmk22 | 2016-09-13
Vous devez vous connecter pour publier un commentaire.
Sauf s'il est masqué exception qui se cache derrière cette stupides exception aléatoire, la raison en est clairement indiqué dans l'exception.
Vérifier la
Id
sur lerole
objet que vous recevez sur votreEdit
action et essayez de récupérer cet id dans la base de données. Le message d'exception-vous que les états qui, il s'attend à trouver une ligne avec un correspondant de l'Id de l'objet que vous avez joint, mais il ne l'est pas, donc, c'est de ne pas faire la mise à jour, car elle ne pouvait pas localiser une ligne correspondante pour le mettre à jour.EDIT :
Vous êtes à la fixation de l'entité à deux reprises, supprimer l'appel à
.Attach(role)
et garder la ligne en-dessous, ce qui est suffisant pour ajouter l'objet le suivi de contexte dans un état modifié.Méfiez-vous que le réglage de l'état de l'entrée de modification sera mise à jour toutes les valeurs de propriété sur appel de
.SaveChanges()
, de sorte que dans le cas où vous souhaitez mettre à jour certaines propriétés, reportez-vous à cette réponse.Si cela ne résout pas votre problème, veuillez vérifier toutes les exceptions internes que vous avez peut-être manqué. Parfois, les messages d'exception n'ont aucun sens et qui masque le vrai problème qui vous pourriez être en mesure de trouver à l'intérieur de l'exception.
hmm je vois que j'ai raté quelque chose. Supprimer la .Attach() de l'appel, vérifier mon montage
J'ai supprimé la ligne, mais le même message d'erreur (
Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded.
), et à l'exception interne est nulle. Il ressemble EF peut-être un rôle dans la base de données avec le modifié nom, il n'est donc pas de retourner quoi que ce soit.OriginalL'auteur Siraj Mansour
Vous pouvez essayer comme indiqué ci-dessous.
Remarque :
Quand
_db.Entry(role).State = EntityState.Modified;
_db
, vous êtes également le marquage de l'toute entité
dirty
._db.SaveChanges()
, EF va générer unupdate
déclaration
will update all the fields of the entity
.Quand
_db.Roles.Attach(role)
_db.Entry(role).State = EntityState.Unchanged;
.update a property on the entity
, la prochaine fois que vous appelezcontext.SaveChanges()
,EF
ne générera pas de undatabase update
pour cetteentity
.c'est à dire Si vous avez besoin de générer une base de données mise à jour,vous devez faire comme ceci :
Attach
ligne, et je continue de courir dans la même erreur.OriginalL'auteur Sampath
Vos réponses ne fonctionne pas pour moi. Et j'ai résolu mon erreur de ce genre.
Modification du Modèle de classe proporties
après ı changé Mon mappage de classe
Dernier changement est
J'espère que Cette solution fonctionne pour quelqu'un.
OriginalL'auteur Haktan Enes Biçer
J'ai résolu ce problème en combinant les deux méthodes
OriginalL'auteur Minh Phuong
Si vous avez un Déclencheur INSTEAD OF INSERT sur la table, la Base de données pour annuler l'opération et EntityFramework feu cette erreur.
OriginalL'auteur Sérgio Ferraz
Même erreur ici, ce qui a fini par être le problème est que je suis de l'insertion tout en réutilisant le code pour la mise à jour ...
Il n'y a pas en état d'être changé lors de l'insertion ...
OriginalL'auteur Иво Недев