2013-12-04 5 views
0

Iam сталкивается с проблемой при использовании заводской модели в MVC. Поскольку я обновляю и пытаюсь отобразить данные из той же таблицы, обновление выполняется в базе данных, но обновленные данные не извлекаются из базы данных. Я чувствую, что он извлекает данные из Сущностей и отображает данные. Я использовал Modelstate.clear() outputcache и т. Д., Но ни один из них не работал.Невозможно очистить кеш в EF

код используется: Для обновления:

public virtual void Update(TObject TObject) 
     { 
      var entry = Context.Entry(TObject); 
      DbSet.Attach(TObject); 
      entry.State = EntityState.Modified; 
     } 

вызова метода Update в моей службе и сохранение изменений:

Registry.RepositoryFactory.GetUsersRepository().Update(userobj); 
      Registry.Context.SaveChanges(); 

Извлечение данных после сохранения: Выбрать:

public virtual IQueryable<TObject> All() 
     { 
      return DbSet.AsQueryable(); 
     } 

Я могу обновить в базе данных, но при попытке получить Извлеките данные немедленно из той же таблицы, что она не попадает в базу данных, я думаю, что она извлекает данные из кеша.

Любые указатели приветствуются.

Заранее благодарен, Girish.

+0

Добро пожаловать в stackoverflow.com. Это помогает, если вы добавите наименьший образец кода, который пропустит вашу проблему. С текстом трудно дать ответ. – rene

+0

'DbSet.AsQueryable();' ничего не извлекает. Кроме того, почему вы хотите получать данные, которые вы только что сохранили? –

+0

Я хочу отображать статус пользователей. Если инактивировать пользователя, он должен быть показан «Неактивно» в моем пользовательском интерфейсе. Итак, я обновляю таблицу Users и извлекаю обновленные данные. Почему не используется DbSet.AsQueryable(); взять что-нибудь? – Girish

ответ

0

Я собираюсь предположить, что вы повторно используете один и тот же объект контекста EF как для Update, так и для Select. Если контекст не удаляется между этими событиями, вы получите устаревший контекст, и данные будут возвращены из кеша EF.

Убедитесь, что вы используете контекст EF между вызовами с наилучшей практикой, чтобы окружить его в инструкции Using. Альтернативой этому является вызов Refresh() в контексте (см. Вопрос this). В какой-то момент вам все равно придется избавляться от контекста, потому что в противном случае он будет продолжать расти, и ваше приложение будет медленнее и медленнее.

Я ответил на аналогичный вопрос here.

+0

Вы абсолютно правы. Прочтите, как использовать метод Refresh i.e, где я должен его использовать? – Girish

+0

Эта ссылка (ссылка на вопрос, на который я ссылался) http://msdn.microsoft.com/en-us/library/bb896255.aspx предоставляет пример кода. Надеюсь, это поможет. – Damon

0

Я следил за ссылкой, предоставленной Деймоном, проблема в том, что Refresh происходит. Но это занимает несколько секунд (2 или 3). Страница загружается немедленно.

Решение, которое сработало для меня, заключается в том, что при извлечении данных из репозитория я устанавливаю объект с помощью Set. И затем я использовал метод Refresh перед извлечением данных.

Код, используемый:

DbSet комплект = ((DbContext) Контекст) .С(); ((IObjectContextAdapter) Контекст) .ObjectContext.Refresh (System.Data.Objects.RefreshMode.StoreWins, set); возвращение DbSet как IQueryable;

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