Как обновить кеш ObjectContext из БД?

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

var somethings = Context.SomethingSet.ToList();

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

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


person LukLed    schedule 25.02.2010    source источник


Ответы (3)


Вам нужен метод Refresh:

Context.Refresh(RefreshMode.StoreWins, somethings);
person Josh    schedule 25.02.2010
comment
Я немного изменил вопрос. Я должен сначала вызвать Context.Refresh(RefreshMode.StoreWins, somethings) и var somethings = Context.SomethingSet.ToList(), чтобы получить добавленные строки, потому что обновление не добавит их. Я только что заметил в профилировщике, что обновление происходит в одном запросе, поэтому производительность неплохая. Спасибо. - person LukLed; 25.02.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

person jrista    schedule 25.02.2010
comment
Я знал, что кто-то даст такой ответ :) Не волнуйтесь. Я использую один ObjectContext для каждого запроса, но у меня есть один контекст, который используется для кэширования некоторых данных. Используется только для чтения. Но хорошо, что вы заметили. - person LukLed; 25.02.2010
comment
Что ж, рад, что вы избавляетесь от своих контекстов. :D Я больше не могу сосчитать, как часто я вижу людей, пытающихся сохранить свои объектные контексты навсегда. Они пытаются решить одну предполагаемую проблему (предполагаемое снижение производительности), в то же время создавая дюжину еще более серьезных проблем, которые в долгосрочной перспективе еще больше снижают производительность. Я стараюсь подавить такое поведение всякий раз, когда сталкиваюсь с ним. ;П - person jrista; 25.02.2010

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

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);
}
person rnofenko    schedule 21.03.2015