Comment effacer les entités de suivi dans le cadre de l'entité
Je suis en cours d'exécution un peu de correction de code qui s'exécute sur un gros tas d'entités, comme les progrès de sa vitesse diminue, c'est parce que le nombre d'entités de suivi dans le contexte d'augmenter à chaque itération, Il peut prendre un certain temps donc je suis de l'enregistrement des modifications à la fin de chaque itération. Chaque itération est indépendant et ne change pas le previosuly chargé des entités.
Je sais que je peux désactiver le suivi des modifications, mais je ne veux pas, parce que ce n'est pas une insertion en bloc de code, mais le chargement des entités et de calculer un peu de choses et si les chiffres ne sont pas corrects définir les nouveaux numéros et de mettre à jour/supprimer/créer certaines autres entités. Je sais que je peux créer un nouveau DbContext pour chaque itération et probablement que ça irait plus vite que de faire tous dans le même exemple, mais je pense qu'il pourrait y avoir une meilleure façon.
Donc la question est; Est-il un moyen de nettoyer les entités précédemment chargé dans la base de données de contexte?
- Vous pouvez les appeler
context.Entry(entity).State = EntityState.Detached
et il va arrêter le suivi de cette entité. - Pourquoi ne pas instancier un nouveau Contexte? Il n'y a vraiment pas grand-généraux, sauf si vous avez besoin d'un code optimisé.
- entity framework frappe le serveur de base de données uniquement pour la modification des entités, vous n'avez pas de problèmes de performances à ce sujet. mais vous pouvez créer un nouveau contexte uniquement composé de tables de travail pour la rendre plus rapide.
- détecter les changements prennent du temps, je ne suis pas inquiet DbPerformance.
- avez-vous fait une mise au point et de suivi de la performance de goulot d'étranglement, ou tout simplement en supposant que cela?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez ajouter une méthode à votre
DbContext
ou une méthode d'extension qui utilise le ChangeTracker pour détacher tous les Ajoutés, Modifiés et Supprimés entités:this.Entry(entity.Entity).State = Detached
? Je pense que vous pouvez juste faireentity.State = Detached
Voir cette réponsevar entity
devrait vraiment êtrevar entry
que c'est l'entrée, pas l'Entité)1. Possibilité de détacher l'entrée
Lorsque vous déconnectez l'entrée de la modification de suivi arrêter le suivi (et devrait aboutir à de meilleures performances)
Voir: http://msdn.microsoft.com/de-de/library/system.data.entitystate(v=vs. 110).aspx
2. Possibilité de travailler avec votre propre
Status
champ + déconnecté contextesPeut-être que vous voulez contrôler l'état de votre entité, indépendamment de sorte que vous pouvez utiliser les graphiques déconnecté. Ajouter une propriété pour le statut de l'entité et de transformer ce statut dans le
dbContext.Entry(entity).State
lorsque vous effectuez des opérations (utilisation d'un référentiel pour ce faire)Voir le lien suivant pour voir un exemple: https://www.safaribooksonline.com/library/view/programming-entity-framework/9781449331825/ch04s06.html
Je suis exécution d'un service windows qui met à jour les valeurs de chaque minute et j'ai eu le même problème. J'ai essayé de courir @DavidSherrets solution, mais après quelques heures, c'est lent. Ma solution était tout simplement de créer un nouveau contexte comme celui-ci pour chaque nouvelle exécution. Simple, mais il fonctionne.
_dbContext = new DbContext();
Je viens de tomber sur ce problème, et finalement je suis tombé sur la meilleure solution pour ceux qui utilisent le typique .NET de Base de l'injection de dépendances. Vous pouvez utiliser une étendue de DbContext pour chaque opération. Qui va réinitialiser
DbContext.ChangeTracker
de sorte queSaveChangesAsync()
de ne pas s'enliser vérification des entités à partir d'itérations passées. Voici un exemple ASP.NET Contrôleur de Base de la méthode:Étant donné que ASP.NET les grands projets utilisent généralement DbContextPool, ce n'est même pas créer/détruire les DbContext objets. (Dans le cas où vous étiez intéressé, DbContextPool fait des appels
DbContext.ResetState()
etDbContext.Resurrect()
, mais je ne recommanderais pas l'appel de ceux qui sont directement à partir de votre code, comme ils vont probablement changer dans les futures versions.)https://github.com/aspnet/EntityFrameworkCore/blob/v2.2.1/src/EFCore/Internal/DbContextPool.cs#L157