2010-07-08 4 views
3

Mon application utilise une instance de contexte qui existe pour la durée de vie de l'application. J'utilise Entity Framework pour lire et écrire toutes les données dans la base de données. Après avoir ajouté des objets, je veux qu'ils soient nettoyés par le garbage collector afin qu'ils ne restent pas en mémoire. J'ai essayé ce qui suit:context.detach - pour la récupération de place

While context.BatchProgresses.Count > 0 
     context.Detach(context.BatchProgresses.First()) 
    End While 

mais cela se déroule dans une boucle infinie. Vous ne devriez pas Context.Detach() retirer des objets de Context.BatchProgresses?

+1

Les contextes singleton sont une * très mauvaise idée * et ne se termineront que dans la misère. Un contexte est une unité de travail. Votre unité de travail n'est pas "toute la durée de vie de mon application". –

+1

J'apprécie le conseil. En fin de compte, j'ai fini par répartir la tâche dans plusieurs contextes. J'ai d'abord évité cette stratégie parce que je m'inquiétais des implications de la création et de la destruction de contextes dans une boucle de minuterie, mais il se trouve qu'il y a peu ou pas d'impact sur les performances. – Terry

Répondre

1

Comme d'habitude dans ces cas, si vous ne voulez pas re-interroger la base de données, mais travailler avec des entités attachées au contexte, vous pouvez utiliser le ObjectStateManager:

var attachedEntities = context. 
         ObjectStateManager. 
         GetObjectStateEntries(EntityState.Added | 
              EntityState.Deleted | 
              EntityState.Modified | 
              EntityState.Unchanged). 
         Where(ent => ent.Entity is BatchProgress). 
         Select(ent => ent.Entity as BatchProgress). 
         ToList(); 

foreach (var attachedEntity in attachedEntities) 
{ 
    context.ObjectStateManager.ChangeObjectState(attachedEntity, EntityState.Detached); 
} 

Réglage du ObjectState à EntityState.Detached supprime l'entité de la collection. Vous pouvez vérifier en récupérant des attachements attachés à la fin - il n'y en aura aucun.

0

C'est seulement une idée, mais l'appel possible de BatchProgress.First() provoque la lecture de la base de données. Assurez-vous (par enregistreur ou profileur SQL) aucune activité SQL est effectuée en raison de cet appel.

Aussi, vous pouvez essayer le code suivant (C#)

var list = context.BatchProgress.ToList(); 
foreach(var item in list) 
    context.Detach(item); 
+0

Malheureusement, context.BatchProgresses.ToList() provoquera également une requête db. – Yakimych

Questions connexes