Entity Framework 4.1 DbSet Reload

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

Метод расширения для IQueryable, Load() позволяет мне предварительно загружать элементы DbSet<>, чтобы я мог привязывать вещи к локальному свойству DbSet<>. Данные в базе данных быстро меняются, поэтому я хочу SaveChanges() и перезагрузить все, даже объекты, которые уже отслеживаются. Вызов метода Load() снова не обновляет элементы, которые отслеживаются, но не помечены как измененные, которые уже загружены.

Каков предпочтительный метод перезагрузки предварительно загруженных элементов в DbSet<>? В верхней части моей головы я могу только подумать о вызове SaveChanges(), затем пройти все записи и установить как отслеживаемые, так и исходные значения в текущие значения в базе данных, а затем Load() любые новые объекты, которые могли быть добавлены. В моем сценарии невозможно удалить объекты, но мне, возможно, придется поддерживать удаление элемента в конечном итоге. Это не кажется правильным, должен быть способ сбросить все и перезагрузить. Казалось бы, легче отбросить мой контекст и начать заново, но все элементы в WPF уже привязаны к Local´ObservableCollection<>, и это просто испортит интерфейс.

Ответ 1

Это не так, как вы должны использовать DbContext, и из-за этого практически невозможно перезагрузить данные. Сохранение одного контекста в течение длительного времени неправильное использование. Ссылка также ответит, почему ваши отслеживаемые объекты не обновляются.

Вы можете выборочно перезагрузить один объект, вызвав Reload на DbEntityEntry:

context.Entry(entity).Reload();

Вы также можете вернуться к ObjectContext и использовать ObjectQuery с помощью MergeOption.OverrideChanges или использовать Refresh для коллекции объектов с RefreshMode.StoreWins.

Все эти подходы имеют некоторые проблемы:

  • Если запись удалена в базе данных, она не будет удалена из контекста.
  • Изменения в отношениях не всегда обновляются.

Единственный правильный способ получить свежие данные - это Dispose контекст, создать новый и загрузить все с нуля - и вы все равно это делаете.

Ответ 2

С Entity Framework 4.1 рекомендация по привязке данных WPF изменилась для использования .Local и постоянный DbContext.

http://blogs.msdn.com/b/efdesign/archive/2010/09/08/data-binding-with-dbcontext.aspx

Конечно, это возможно избавиться от него, когда вам это нужно, но это может негативно повлиять на пользовательский интерфейс, если вы это сделаете.

Здесь другой метод, но я не уверен, что он учитывает функции EF4.1:

http://msdn.microsoft.com/en-us/library/cc716735.aspx

Ответ 3

DbContexts должны жить короткое время, Подумайте о том, как сохранить изменения и утилизировать их с самого начала. У вас есть 2 набора объектов.. один из db и другой для привязки.

Ответ 4

Пожалуйста, используйте using() для CRUD.It автоматически перезагрузит обновленные данные.

using (myDbContext context = new myDbContext())
{

}

С наилучшими пожеланиями, Thet Tin Oo