Maison >développement back-end >C++ >Comment résoudre les conflits clés de l'entité lors de la modification des entités dans ASP.NET MVC?
Dépannage Les conflits de clés de l'entité dans ASP.NET MVC ENTITY MISE À JOUR
Lors de la mise à jour des entités dans ASP.NET MVC via les demandes de publication, vous pouvez rencontrer l'erreur suivante:
<code>Attaching an entity of type 'MODELNAME' failed because another entity of the same type already has the same primary key value.</code>
Cette erreur découle de la tentative de joindre une entité au DbContext
tandis qu'une autre entité avec la clé primaire identique existe déjà dans le graphique d'objet du contexte. Le DbContext
essaie de fusionner les entités, entraînant un conflit.
Scénario et cause racine
Imaginez modifier une entité «A» dans un contrôleur. L'action Get utilise Find()
pour charger l'entité. L'action de la publication tente ensuite de la joindre et de la mettre à jour. Cependant, si une autre entité «A» avec la même clé primaire est chargée ailleurs (par exemple, pendant la validation d'accès aux utilisateurs), cela crée un conflit de suivi.
Résolution en utilisant AsNoTracking()
La solution la plus efficace consiste à empêcher le DBContext de suivre l'entité utilisée pour la validation. Utilisez la méthode AsNoTracking()
:
<code class="language-csharp">private bool canUserAccessA(int aID) { int userID = WebSecurity.GetUserId(User.Identity.Name); int aFound = db.Model.AsNoTracking().Where(x => x.aID == aID && x.UserID == userID).Count(); return (aFound > 0); }</code>
AsNoTracking()
s'assure que l'entité de validation n'interfère pas avec la mise à jour de l'entité.
Alternative: la Méthode Detach()
Une autre approche consiste à détacher l'entité de la DbContext
avant la modification en utilisant la méthode Detach()
. Cela empêche le suivi des conflits. Cependant, sachez que le détachement peut avoir un impact sur d'autres parties de votre code, alors considérez soigneusement ses implications avant d'implémenter cette solution.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!