Ne se entités avec AsNoTracking() désactiver l'appel automatique de DetectChanges()?
J'ai appris à connaître ce concept de AsNoTracking()
, DetectChanges()
, et AutoDetectChangesEnabled
très récemment. Je comprends que lors de l'extraction des enregistrements de la base de données via Entity Framework avec AsNoTracking()
utilisé, Entity Framework ne fait pas le suivi des modifications sur les enregistrements et la mise à jour de n'importe quelle propriété de la récupérés enregistrement échouera dans ce cas.
Ma question est de savoir si les enregistrements sont récupérés de cette manière, il sera également causer la désactivation de l'appel automatique de DetectChanges() ou qui doivent le faire de manière explicite par le cadre:
Context.Configuration.AutoDetectChangesEnabled = false;
Également de bien vouloir me faire savoir quel est l'impact (en termes de performances) a-t-elle si les deux actions sont effectuées lors de l'extraction des données strictement pour lire uniquement des fins:
Context.Configuration.AutoDetectChangesEnabled = false;
Context.Set<T>().AsNoTracking();
Vous devez vous connecter pour publier un commentaire.
Pas il ne sera pas. Mais vous devez réaliser que
AsNoTracking
etDetectChanges
n'ont rien à voir les uns avec les autres (à l'exception de la partie de l'EF). Les objets récupérés avecAsNoTracking
ne sera jamais changer détecté de toute façon, si AutoDetectChanges est activé ou non. En outre,AsNoTracking
travaille sur unDbSet
niveau,AutoDetectChangesEnabled
sur le niveau de contexte. Il serait mauvais d'avoir unDbSet
méthode affectent l'ensemble du contexte.Bien, vous avez probablement juste de ne pas désactiver AutoDetectChanges. Si vous le faites, vous devez savoir ce que vous faites.
Comme l'a dit, ils ne sont pas liés. Ils peuvent à la fois améliorer la performance de leur propre manière.
AsNoTracking
est l'endroit idéal si vous souhaitez récupérer des données en lecture seule. Il n'a pas d'effets secondaires (comme dans: son effet est clair)Réglage
AutoDetectChangesEnabled = false
s'arrête automatiquement des appels deDetectChanges
(qui peuvent être nombreuses), mais il a des effets secondaires, vous devez être conscient de. De Lerman & Miller livre DbContext:Nous avons trouvé que la mise
AutoDetectChangesEnabled = false
peuvent avoir de graves (c'est à dire le facteur de 10) impact sur les performances.Fond: Notre système est entièrement composé de modèle EF objets que le changement d'utilisation de la détection des procurations. C'est, de toutes de notre DB, les champs et les propriétés relationnelles sont déclarées en tant que virtuel. Nous avons également une relativement profondément structuré modèle d'objet. C'est l'objet A contient un ensemble de l'objet B, qui à son tour contient un ensemble d'Objet de C, etc. Nous avons observé que l'instanciation d'un non-trivial (> 100) nombre de ces objets par l'intermédiaire d'un EF/requête LINQ est cher. Par exemple, dans un cas, l'instanciation de 250 objets requis environ 2 secondes. Nous avons également observé que l'instanciation de la même structure, mais en utilisant des objets anonymes plutôt tenus à environ 25 ms. Enfin, nous avons observé que si l'on
AutoDetectChangesEnabled = false
, que nous pourrions utiliser la requête de l'instanciation de modèle EF objets et matérialisation de nouveau était d'environ 25 ms.Donc, au moins pour nous, il y avait d'énormes gains par la valeur false. Nous utilisons un motif d'Unité De Travail, et de nous indiquer explicitement si l'Unité de Travail est en lecture seule ou non. Pour une lecture seule unité de travail, le réglage de
AutoDetectChangesEnabled = false
est parfaitement sûr, car il n'y aura jamais aucun changement. En fait, nous avons ajouté cette modification de notre système de deux ans après notre première version (donc il y avait beaucoup, beaucoup de pré-existante de l'unité des œuvres dans le code) et le changement n'a pas de casser quoi que ce soit, et une amélioration significative des performances.Nous avons également expérimenté avec
AsNoTracking()
et trouvé qu'il nous a donné pratiquement pas d'augmentation de la performance à tous. Si je comprends bien, une requête avecAsNoTracking()
signifie que les objets ne seront pas placés dans la carte d'identité, et ce sera de force EF pour récupérer à nouveau l'objet à partir du disque s'il est référencé plus d'une fois dans le contexte (par exemple, dans les différentes requêtes). Il y a donc un potentiel de baisse deAsNoTracking()
.Détails De Mise En Œuvre:
-
DbContext
. Nous faisons cela parce que nous avons utiliser le suivi des modifications des procurations partout, et ainsi de suivi des modifications n'est jamais requise (c'est en fait intégré dans le proxy généré des classes). Dans leDBContext
son juste une seule ligne de code:this.Configuration.AutoDetectChangesEnabled = false;