J'ai une question concernant l' .AsNoTracking()
extension, car c'est tout à fait nouveau et assez déroutant.
J'utilise un contexte par demande pour un site Web.
Beaucoup de mes entités ne changent pas, donc je n'ai pas besoin d'être suivi, mais j'ai le scénario suivant où je ne suis pas sûr de ce qui va dans la base de données, ou même si cela fait une différence dans ce cas.
Cet exemple est ce que je fais actuellement:
context.Set<User>().AsNoTracking()
// Step 1) Get user
context.Set<User>()
// Step 2) Update user
C'est la même chose que ci-dessus mais en supprimant l' .AsNoTracking()
étape 1:
context.Set<User>();
// Step 1) Get user
context.Set<User>()
// Step 2) Update user
Les étapes 1 et 2 utilisent le même contexte mais se produisent à des moments différents. Ce que je ne peux pas déterminer, c'est s'il y a une différence. Comme l'étape 2 est une mise à jour, je suppose que les deux frapperont la base de données de toute façon.
Quelqu'un peut-il me dire quelle est la différence?
la source
voir cette page Entity Framework et AsNoTracking
Ce que fait AsNoTracking
Entity Framework expose un certain nombre d'options de réglage des performances pour vous aider à optimiser les performances de vos applications. L'une de ces options de réglage est
.AsNoTracking()
. Cette optimisation vous permet de dire deEntity Framework
ne pas suivre les résultats d'une requête. Cela signifie qu'ilEntity Framework
n'effectue aucun traitement ou stockage supplémentaire des entités renvoyées par la requête. Cependant, cela signifie également que vous ne pouvez pas mettre à jour ces entités sans les rattacher au graphique de suivi.il y a des gains de performances importants à réaliser en utilisant AsNoTracking
la source
Pas de suivi des requêtes LINQ to Entities
L'utilisation de AsNoTracking () est recommandée lorsque votre requête est destinée aux opérations de lecture. Dans ces scénarios, vous récupérez vos entités mais elles ne sont pas suivies par votre contexte, ce qui garantit une utilisation minimale de la mémoire et des performances optimales
Plus d'informations disponibles ici:
Considérations de performances pour Entity Framework
Entity Framework et NoTracking
la source
La désactivation du suivi entraînera également la diffusion de vos jeux de résultats en mémoire. Ceci est plus efficace lorsque vous travaillez avec de grands ensembles de données et que vous n'avez pas besoin de l'ensemble de données en une seule fois.
Références:
la source
AsNoTracking () permet de contourner l'exigence de "clé unique par enregistrement" dans EF (non mentionnée explicitement par d'autres réponses).
Cela est extrêmement utile lors de la lecture d'une vue qui ne prend pas en charge une clé unique, car certains champs peuvent être annulés ou la nature de la vue n'est pas indexable logiquement.
Dans ces cas, la "clé" peut être définie sur n'importe quelle colonne non nullable mais AsNoTracking () doit être utilisé avec chaque requête, sinon les enregistrements (dupliqués par clé) seront ignorés.
la source
Si vous avez quelque chose d'autre qui modifie la base de données (par exemple un autre processus) et devez vous assurer que vous voyez ces changements, utilisez
AsNoTracking()
, sinon EF peut vous donner la dernière copie que votre contexte avait à la place, il est donc bon d'utiliser généralement un nouveau contexte à chaque requête :http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/
la source