EF Core .AsNoTracking()
et écritures de base de données : une clarification
Entity Framework Core (EF Core) propose .AsNoTracking()
d'optimiser les requêtes en désactivant le suivi des modifications. Ceci est avantageux lorsque vous avez uniquement besoin de lire des données et que vous n'avez pas l'intention de les modifier dans le contexte actuel. Cependant, son impact sur les mises à jour ultérieures nécessite un examen attentif.
Votre exemple met en évidence un point de confusion courant :
Scénario : À l'aide d'un contexte par requête, vous récupérez d'abord un utilisateur avec .AsNoTracking()
, puis tentez de mettre à jour le même utilisateur.
Étape 1 : context.Set<user>().AsNoTracking()
récupère un utilisateur sans suivi.
Étape 2 : context.Set<user>()
tente de mettre à jour l'utilisateur non suivi.
La différence cruciale :
La principale différence entre utiliser .AsNoTracking()
et ne pas l'utiliser réside dans la façon dont EF Core gère l'état de l'entité.
Sans .AsNoTracking()
: EF Core suit l'entité. Lorsque vous mettez à jour et enregistrez, EF Core détecte automatiquement les modifications et met à jour la base de données en conséquence. Il s'agit de l'approche la plus simple et la plus directe si vous avez l'intention de modifier l'entité.
Avec .AsNoTracking()
: L'entité n'est pas suivie. EF Core ne connaît pas les modifications que vous apportez. Pour mettre à jour la base de données, vous devez explicitement attacher l'entité au contexte en utilisant context.Entry(user).State = EntityState.Modified;
avant d'appeler context.SaveChanges()
. Dans le cas contraire, un nouvel enregistrement sera probablement inséré au lieu de la mise à jour de celui existant.
En bref, .AsNoTracking()
permet des gains de performances pour les opérations en lecture seule. Pour les opérations de mise à jour, évitez .AsNoTracking()
pour la récupération initiale ou soyez prêt à gérer manuellement l'état de l'entité dans le contexte avant d'enregistrer les modifications. Le choix dépend de vos besoins spécifiques et si vous privilégiez les performances ou un code plus simple.
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!