Как обновить кэш ObjectContext из БД? - PullRequest
15 голосов
/ 25 февраля 2010

Мы загружаем данные из БД:

var somethings = Context.SomethingSet.ToList();

Затем кто-то удаляет или добавляет строки вне контекста. Из контекста все еще есть кеши удаленных объектов, поскольку он не знает, что они были удалены Даже если я вызову Context.SomethingSet.ToList (), наш контекст все еще содержит удаленные объекты, и свойства навигации не верны.

Каков наилучший способ обновить весь набор из базы данных?

Ответы [ 3 ]

19 голосов
/ 25 февраля 2010

Метод Обновить - это то, что вы ищете:

Context.Refresh(RefreshMode.StoreWins, somethings);
12 голосов
/ 25 февраля 2010

Контекст данных EF является реализацией шаблона Unit of Work. Как таковая, она НЕ предназначена для того, чтобы ее можно было хранить за рамками выполняемой работы. Как только ваша работа будет завершена, ожидается, что ваш контекст данных будет отброшен.

Это фундаментальное проектное решение для EF v1, EF v4 и LINQ to SQL. Если у вас нет очень специфических моделей использования данных и обширных объемов памяти, вам следует избегать хранения контекстов данных дольше, чем это абсолютно необходимо для выполнения вашей единицы работы.

http://sdesmedt.wordpress.com/2009/02/18/unit-of-work-pattern/

http://takacsot.freeblog.hu/Files/martinfowler/unitOfWork.html

1 голос
/ 21 марта 2015

Для виртуальных свойств перезагрузка не помогает. Нужно отсоединить и загрузить снова

public T Reload<T>(T entity) where T : class, IEntityId
{
    ((IObjectContextAdapter)_dbContext).ObjectContext.Detach(entity);
    return _dbContext.Set<T>().FirstOrDefault(x => x.Id == entity.Id);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...