Dépannage des erreurs de clé primaire en double lors de la connexion des entités dans ASP.NET MVC
Dans les applications ASP.NET MVC, tenter de joindre une entité peut échouer en raison d'une violation de contrainte de clé primaire en double. Cela se manifeste souvent comme un message d'erreur indiquant qu'une entité avec la même clé principale existe déjà. Cet article détaille une cause commune et sa solution.
Le problème se pose fréquemment lors de la mise à jour de l'état d'une entité vers EntityState.Modified
en utilisant db.Entry(entity).State = EntityState.Modified
. L'enquête révèle souvent qu'une fonction distincte, responsable de l'autorisation ou de la récupération des données, précharge la même entité avant la mise à jour de l'état. Ce processus de préchargement peut conduire à l'entité se détacher, provoquant l'échec de l'opération Attach
ultérieure parce que le cadre estime qu'il essaie d'ajouter un double.
La solution implique d'empêcher la fonction de préchargement de suivre l'entité chargée. Cela peut être réalisé en utilisant la méthode AsNoTracking()
dans la requête du cadre d'entité.
Considérez l'exemple suivant d'une fonction problématique canUserAccessA
:
<code class="language-csharp">// Problematic function - loads and tracks the entity private bool canUserAccessA(int aID) { int userID = WebSecurity.GetUserId(User.Identity.Name); int aFound = db.Model.Where(x => x.aID == aID && x.UserID == userID).Count(); // Tracks the entity return (aFound > 0); }</code>
Cette fonction charge l'entité, ce qui le rend trackable par le contexte. Pour corriger cela, modifiez la fonction à utiliser AsNoTracking()
:
<code class="language-csharp">// Corrected function - loads the entity without tracking 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>
L'utilisation AsNoTracking()
garantit que l'entité chargée n'est pas suivie par le contexte, empêchant les conflits avec les opérations Attach
ou Update
ultérieures. Notez que bien que l'utilisation de .Find(aID)
avec AsNoTracking
puisse sembler plus simple, elle peut être inefficace en fonction de la base de données et de la configuration de contexte. La requête fournie offre une approche plus robuste.
Cette modification résout efficacement le problème de clé primaire en double, fournissant une solution fiable pour des problèmes similaires dans le développement ASP.NET MVC.
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!