Как назначить контекст и обновить его в Entity Framework?

#wpf #entity-framework

#wpf #entity-framework

Вопрос:

Я создал новый объект entity и привязал его к элементам управления в другом окне (окно редактирования). После изменения и сохранения я назначил новый объект entity объекту в главном окне. Старый объект entity привязан к сетке данных, теперь я хочу, чтобы в сетке данных отображались данные, которые я изменил и сохранил.

Метод ObjectContext.Refresh (RefreshMode, Object) кажется тем, что я хочу, но я не знаю, как его правильно использовать.

Короче говоря :
У меня есть главное окно с datagrid, отображающее все данные таблицы. Пользователи могут выбрать одну строку и отредактировать ее в окне редактирования. После сохранения в datagrid должно отображаться то, что было изменено.

Комментарии:

1. Как вы структурировали свой WPF — как проект vanilla / default или MVVM?

2. Черт возьми, я перетаскиваю объект для создания сетки данных в mainwindow. Для окна редактирования я задаю datacontext с запросом. Например: datacontext = MyContext.customer.where(q=>q.id.equal(id_selected_from_mainwindow));

Ответ №1:

Здесь лучше всего использовать an ObservableCollection в качестве источника данных для datagrid вместо запроса.

И посмотрите на реализацию INotifyPropertyChanged интерфейса в вашем Customer классе.

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

При этом изменения, внесенные как в коллекцию клиентов, так и в отдельные объекты клиентов (если они присутствуют в datagrid), будут автоматически обновлены для вас.

Редактировать

Должен признать, что я немного спешу предлагать какой-либо код на данный момент, но вот довольно хорошая статья, в которой объясняется, как использовать ObservableCollections и классы, которые реализуют INotifyPropertyChanged . В нем также есть примеры кода, которые, хотя в VB.NET это должно дать вам достаточно идей, чтобы начать работу.

По сути, вы разделяете свой код на отдельные уровни UI (View), бизнес-логику (модель представления) и уровень данных (модель, в которой находится ваша entity Framework).

Вы привязываете свою сетку данных к свойству ObservableCollection type в своем классе Customers, и ваше окно редактирования csutomer привязывается к экземпляру вашего класса Customer.

Комментарии:

1. Крисбд, не могли бы вы показать мне пример того, как заставить коллекцию клиентов обновлять изменения из отдельных объектов Customer?

2. Привет — сегодня недостаточно времени для написания и публикации кода, но взгляните на статью, на которую я добавил ссылку в свой ответ — она объяснит больше.

3. Даже со связанным примером я изо всех сил пытаюсь понять, как использовать ObservableCollection для обнаружения изменений, внесенных в объект entity, из отдельного окна в шаблоне MVVM. Как ObservableCollection может узнать, что один из его элементов изменен, без того, чтобы проекты просмотра связывались с проектом модели для определения типа объекта сущности и деталей?

4. Извините, Джесслин, меня давно не было. Привяжите свой View XAML к наблюдаемой коллекции. О любых изменениях, внесенных в коллекцию, NET framework уведомляет представление. Вам не нужно ничего обрабатывать самостоятельно. Для передачи изменений, внесенных пользователем в пользовательский интерфейс, обратно в базу данных, я бы предложил реализовать кнопку «Сохранить», которая запускает команду для передачи обновлений обратно на уровень данных.