Сохранить один, Сохранить все в Entity Framework - PullRequest
2 голосов
/ 14 апреля 2011

Я все еще изучаю шаблоны единиц работы, шаблоны репозиториев и т. Д.

Мое приложение:

  • У меня есть список объектов, скажем, клиенты в виде списка
  • Когда я выбираю клиента, отображается форма детализации, в которой можно редактировать его детали

Я пытаюсь понять стандартный способ MVVM / Entity Framework для выполнения следующих действий:

  • Когда пользователь редактирует клиента, он отображается как «измененный» (но не сохраненный)
  • Пользователь может выбрать либо сохранение текущего клиента, либо сохранение всех измененных клиентов
  • Команды / кнопки Сохранить или Сохранить все отключены, если эта опция недоступна (текущий клиент не изменился или все клиенты не изменились)

Кажется достаточно простым?Но я понятия не имею, как подойти к этому, используя MVVM / EF.Использую ли я UoW, отсоединяю ли объекты и повторно присоединяю их к контексту, чтобы я мог сохранять их по одному?Как определить, изменен или не изменен объект?

Помогите!Спасибо!

1 Ответ

4 голосов
/ 14 апреля 2011

Я добавлю несколько замечаний:

Критическим моментом в ваших требованиях является, на мой взгляд, возможность сохранить одного клиента или всех измененных клиентов. Вы должны принять во внимание, что Entity Framework не имеет метода для сохранения изменений одного или нескольких выбранных объектов в контексте. Вы можете сохранить только изменения всей Единицы работы (которая является ObjectContext или DbContext в EF), позвонив по номеру myContext.SaveChanges().

Это приводит к выводу, что вы не можете использовать список всех клиентов и форму сведений о клиенте в одной единице работы (= контекст EF), в которой все клиенты являются присоединенными объектами. Если вы сделаете это, вы можете предоставить функцию / кнопку для сохранения всех изменений , но не можете сохранить в форме только текущего клиента.

Итак, я бы подумал, действительно ли вам нужны эти функции, или я бы работал с объектами в отключенном состоянии. Это будет означать, что вы должны загрузить список клиентов из базы данных и после этого удалить контекст. Когда вы сохраняете изменения - и теперь не имеет значения, все ли изменения или изменения только для одного клиента - вы можете создать новый контекст, извлечь исходную сущность / сущности из базы данных и обновить ее с измененными свойствами.

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

Чтобы узнать, был ли объект клиента изменен или нет, контекст EF может быть полезен, поскольку он отслеживает состояние объекта. Например, вы можете запросить ObjectStateManager для клиента и проверить, находится ли он в состоянии «Изменено». Но чтобы иметь эту опцию, вам нужно будет работать с присоединенными сущностями, как описано выше. Поскольку вы не можете сохранить (или также отменить) изменения одного объекта, сомнительно, чтобы было вообще целесообразно показать пользователю, что клиент 1 и клиент 3 изменились. (Я бы, вероятно, показывал только «некоторые клиенты изменились».)

Если вы работаете с отсоединенными объектами, вам нужно вручную управлять тем, какие клиенты изменились или нет, внедрив какую-то логику «грязного флага». Вот нить об этом:

Различные способы реализации функции «грязного» флага

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