2010-02-25 2 views
14

Мы загружаем данные из БД:Как обновить кеш ObjectContext от db?

var somethings = Context.SomethingSet.ToList(); 

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

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

ответ

18

Refresh метод это то, что вы ищете:

Context.Refresh(RefreshMode.StoreWins, somethings); 
+1

Я немного изменил вопрос. Я должен вызвать 'Context.Refresh (RefreshMode.StoreWins, somethings)' first и 'var somethings = Context.SomethingSet.ToList()' для добавления добавленных строк, потому что обновление не добавит их. Я только заметил в профилировщике, что обновление идет по одному запросу, поэтому производительность неплохая. Благодарю. – LukLed

10

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

Это принципиальное дизайнерское решение как для 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

Я знал, что кто-то даст ответ :) Не беспокойтесь. Я использую один ObjectContext для каждого запроса, но у меня есть один контекст, который используется для кэширования некоторых данных. Он используется только для чтения. Но хорошо, что вы заметили. – LukLed

+0

Хорошо, рад, что вы избавляетесь от своих контекстов. : D Я больше не могу сосчитать, как часто я вижу людей, которые пытаются сохранить свои контексты объектов навсегда. Они пытаются решить одну воспринимаемую проблему (предполагаемый удар производительности), в то же время они создают еще дюжину более сложных проблем, которые в конечном итоге также ухудшают производительность. Я пытаюсь подавить это поведение всякий раз, когда сталкиваюсь с ним. ; P – jrista

1

Для виртуальных свойств 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); 
} 
Смежные вопросы