web-dev-qa-db-fra.com

Quelle est la différence entre .AsNoTracking ()?

J'ai une question concernant l'extension .AsNoTracking(), car elle est tout à fait nouvelle et source de confusion.

J'utilise un contexte par demande pour un site Web.

Bon nombre de mes entités ne changent pas et n'ont donc pas besoin d'être suivies, mais je suis dans 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 suis en train de faire:

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 la .AsNoTracking() de l’é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 vont de toute façon toucher la base de données.

Quelqu'un peut-il me dire quelle est la différence?

197
dotnetnoob

La différence est que, dans le premier cas, l'utilisateur récupéré n'est pas suivi par le contexte. Ainsi, lorsque vous souhaitez enregistrer l'utilisateur dans la base de données, vous devez l'associer et définir correctement l'état de l'utilisateur afin que EF sache qu'il doit mettre à jour l'utilisateur existant. au lieu d'insérer un nouveau. Dans le second cas, vous n'avez pas besoin de le faire si vous chargez et enregistrez l'utilisateur avec la même instance de contexte, car le mécanisme de suivi le gère pour vous.

158
Ladislav Mrnka

voir cette page Entity Framework et AsNoTracking

Que fait AsNoTracking?

Entity Framework propose un certain nombre d'options de réglage des performances pour vous aider à optimiser les performances de vos applications. Une de ces options de réglage est .AsNoTracking(). Cette optimisation vous permet d'indiquer à Entity Framework de ne pas suivre les résultats d'une requête. Cela signifie que Entity Framework n'effectue aucun traitement ni stockage supplémentaire des entités renvoyées par la requête. Toutefois, cela signifie également que vous ne pouvez pas mettre à jour ces entités sans les rattacher au graphique de suivi.

l'utilisation d'AsNoTracking présente des gains de performances significatifs

148
Moji

Pas de suivi des requêtes LINQ to Entities

L'utilisation de AsNoTracking () est recommandée lorsque votre requête est destinée à des opérations de lecture. Dans ces scénarios, vous récupérez vos entités mais elles ne sont pas suivies par votre contexte. Cela garantit une utilisation minimale de la mémoire et des performances optimales.

Pros

  1. Amélioration des performances par rapport aux requêtes LINQ habituelles.
  2. Objets entièrement matérialisés.
  3. Le plus simple à écrire avec la syntaxe intégrée dans le langage de programmation.

Inconvénients

  1. Ne convient pas aux opérations CUD.
  2. Certaines restrictions techniques, telles que: Les modèles utilisant DefaultIfEmpty pour les requêtes OUTER JOIN entraînent des requêtes plus complexes que les simples instructions OUTER JOIN dans Entity SQL.
  3. Vous ne pouvez toujours pas utiliser LIKE avec le filtrage général.

Plus d'infos disponibles ici:

Considérations de performance pour Entity Framework

Entity Framework et NoTracking

42
NullReference

Si vous désactivez le suivi, vos jeux de résultats seront également diffusés en mémoire. Cela est plus efficace lorsque vous travaillez avec de grands ensembles de données et que vous n’avez pas besoin de tout l’ensemble de données en même temps.

Références:

31
Ronnie Overby

AsNoTracking () permet de contourner l'exigence de "clé unique par enregistrement" dans EF (non explicitement mentionnée dans les autres réponses).

Ceci est extrêmement utile lors de la lecture d'une vue qui ne prend pas en charge une clé unique, car certains champs ont peut-être la valeur NULL 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 ensuite être utilisé avec chaque requête. Les autres enregistrements (doublons par clé) seront ignorés.

9
crokusek

Si vous avez quelque chose d'autre qui modifie la base de données (disons un autre processus) et que vous devez vous assurer de voir ces modifications, utilisez AsNoTracking(), sinon EF peut vous donner la dernière copie de votre contexte, il est donc bon d'utiliser habituellement un nouveau contexte à chaque requête:

http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/

6
andrew pate