context.detach - для сборки мусора - PullRequest
3 голосов
/ 08 июля 2010

Мое приложение использует один экземпляр контекста, который существует в течение всего времени существования приложения. Я использую Entity Framework для чтения и записи всех данных в базу данных. После добавления объектов я хочу, чтобы они были очищены сборщиком мусора, чтобы они не сохранялись в памяти. Я пробовал следующее:

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

но это идет в бесконечный цикл. Разве Context.Detach() не должен удалять предметы из Context.BatchProgresses?

Ответы [ 2 ]

1 голос
/ 09 июля 2010

Как обычно в таких случаях, если вы не хотите повторно запрашивать базу данных, а работаете с объектами, привязанными к контексту, вы можете использовать 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);
}

Установка ObjectState вEntityState.Detached удаляет сущность из коллекции.Вы можете проверить, выбрав attachEntities снова в конце - их не будет.

0 голосов
/ 09 июля 2010

Это всего лишь идея, но возможный вызов BatchProgress.First () вызывает чтение базы данных.Убедитесь, что (с помощью регистратора или средства профилирования SQL) никакие действия SQL не выполняются из-за этого вызова.

Также вы можете попробовать следующий код (C #)

var list = context.BatchProgress.ToList();
foreach(var item in list)
    context.Detach(item);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...