2013-12-16 6 views
1

Я читал везде, что правильный способ получить свежие данные из базы данных - создать новый экземпляр DbContext и отказаться от существующего. Хотя это может быть obvoius для некоторых сценариев, мне трудно реализовать это в более сложном сценарии. Тип рассматриваемого приложения - клиентское приложение, где контекст живет до тех пор, пока отображается форма/представление.DbContext кэшированные данные

Например, представьте, что мы добавляем некоторые данные типа A (это основные данные), а конкретный экземпляр типа A ссылается на объекты типа B и C (это данные, на которые ссылаются). Это означает, что на экране я мог бы загрузить список A, список B и список C. Давайте скажем, что список B получил некоторые изменения в сети, которые я хотел бы загрузить. Как я могу обновить список B, без необходимости извлечь все три списка из базы данных (потому что, если я уничтожу контекст, то есть то, что мне нужно будет делать?

obvoius mehod бы что-нибудь, как

Context.Set<B>().AsNoCache().ToList(); 

, которые мы не имеем ...

ответ

0

Во время тестов я обнаружил, что единственным методом, который обновляет данные с помощью текущих записей из базы данных (добавляется, обновляется и удаляется), является использование ObjectSet ObjectContext и установка MergeOption для OverwriteChanges (DbContext не предоставляет такой метод).

var objectContext = ((IObjectContextAdapter)Context).ObjectContext; 
ObjectSet<T> set = objectContext.CreateObjectSet<T>(); 
set.MergeOption = MergeOption.OverwriteChanges; 
var list = set.ToList(); 
4

метод вы ищете является here

Context.Set<B>().AsNoTracking().ToList(); 
+0

Я не вижу, как AsNoTracking можно использовать в описанном выше сценарии, но, возможно, я ничего не вижу. Если я не отслеживаю что-то, это означает, что он не привязан к контексту. Если он не привязан к контексту, он не может быть обновлен. В приведенном выше сценарии я обновляю данные. Итак, как вы точно это сделали? – Goran

+0

@ Goran вы можете прикреплять объекты, которые не отслеживаются. Вы даже можете привязать объект к другому контексту к тому, который его материализовал. – qujck

+0

Я знаю, что могу прикрепить его. Если я его поймаю, то он будет кэшироваться. Как я буду обновлять его, поскольку теперь его отслеживают, что является противоположным состоянием того, что вы предложили? – Goran

1

Если вы хотите обновить существующий список сущностей остроумия ч, возможно, обновленные значения из БД, вы можете использовать ObjectContext «s Refresh метод:

// what to refresh 
// this will refresh all cached instances of B entities 
var entitiesToRefresh = dbContext.Set<B>().Local; 

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
objectContext.Refresh(RefreshMode.StoreWins, entitiesToRefresh); 

Примечание это не будет загружать новые объекты из БД, если необходимо элементы, добавленные в список - вам нужно будет повторный запрос для тех, Предметы.

+0

Это метод, который Я использую, когда я работаю с одним списком сущностей. Однако я не вижу способ, которым я могу обновлять данные для графа объектов? Представьте себе, что сценарий выше, где A - счет-фактура, B - InvoiceItem, C - продукт, D - клиент и т. Д.IF Invoice 123 изменяется в сети, и я просматриваю счета-фактуры (назад/вперед). Как загрузить новые данные для счета 123, когда я перейду к нему? – Goran

+0

Создайте список объектов из графа объектов, которые хотите обновить. – Moho

+0

Итак, скажем, я нажимаю кнопку назад, чтобы загрузить предыдущую запись. На данный момент я не знаю, что такое предыдущая запись, поэтому мне нужно будет извлечь ее из базы данных (чтобы получить добавленные элементы). Затем я проверил бы, будет ли он кэширован. Если да, то я бы сделал три списка, каждый для родительской сущности, детей и внуков, и отправлю их в Refresh. Это то, что вы советуете, мне нужно убедиться, что я понял, прежде чем делать некоторые тесты. – Goran

Смежные вопросы