Entity Framework 4.1 DbSet Обновить - PullRequest
       10

Entity Framework 4.1 DbSet Обновить

11 голосов
/ 27 апреля 2011

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

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

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

Ответы [ 4 ]

25 голосов
/ 27 апреля 2011

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

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

context.Entry(entity).Reload();

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

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

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

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

8 голосов
/ 30 июня 2011

В 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

1 голос
/ 27 апреля 2011

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

0 голосов
/ 20 июля 2015

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

using (myDbContext context = new myDbContext())
{

}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...