Maison > développement back-end > C++ > Comment résoudre 'la fixation d'une entité Échec en raison des valeurs de clé primaire' Erreurs dans ASP.NET MVC?

Comment résoudre 'la fixation d'une entité Échec en raison des valeurs de clé primaire' Erreurs dans ASP.NET MVC?

Patricia Arquette
Libérer: 2025-01-30 08:16:10
original
1032 Les gens l'ont consulté

How to Resolve

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>
Copier après la connexion

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>
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal