Как обновить кеш ObjectContext от db?

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

var somethings = Context.SomethingSet.ToList();

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

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

Ответы

Ответ 1

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

Context.Refresh(RefreshMode.StoreWins, somethings);

Ответ 2

Контекст данных 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

Ответ 3

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

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);
}