Ответ 1
Обновить - это то, что вы ищете:
Context.Refresh(RefreshMode.StoreWins, somethings);
Мы загружаем данные из db:
var somethings = Context.SomethingSet.ToList();
Затем кто-то удаляет или добавляет строки вне контекста. Out context по-прежнему имеет удаленные объекты кэшей, поскольку он не знает, что они были удалены. Даже если я вызываю Context.SomethingSet.ToList(), наш контекст все еще содержит удаленные объекты, а свойства навигации неверны.
Каков наилучший способ обновления всего набора из базы данных?
Обновить - это то, что вы ищете:
Context.Refresh(RefreshMode.StoreWins, somethings);
Контекст данных 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
Для виртуальных свойств 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);
}