Я добавлю несколько замечаний:
Критическим моментом в ваших требованиях является, на мой взгляд, возможность сохранить одного клиента или всех измененных клиентов. Вы должны принять во внимание, что Entity Framework не имеет метода для сохранения изменений одного или нескольких выбранных объектов в контексте. Вы можете сохранить только изменения всей Единицы работы (которая является ObjectContext
или DbContext
в EF), позвонив по номеру myContext.SaveChanges()
.
Это приводит к выводу, что вы не можете использовать список всех клиентов и форму сведений о клиенте в одной единице работы (= контекст EF), в которой все клиенты являются присоединенными объектами. Если вы сделаете это, вы можете предоставить функцию / кнопку для сохранения всех изменений , но не можете сохранить в форме только текущего клиента.
Итак, я бы подумал, действительно ли вам нужны эти функции, или я бы работал с объектами в отключенном состоянии. Это будет означать, что вы должны загрузить список клиентов из базы данных и после этого удалить контекст. Когда вы сохраняете изменения - и теперь не имеет значения, все ли изменения или изменения только для одного клиента - вы можете создать новый контекст, извлечь исходную сущность / сущности из базы данных и обновить ее с измененными свойствами.
Но работа с присоединенными или отсоединенными объектами - или с одним живым контекстом EF на представление / форму или создание только одного кратковременного контекста на операцию CRUD - на мой взгляд, является важным конструктивным решением. Как правило, существует возможность привязать ваши сущности к контексту в течение жизненного цикла представления / формы, чтобы упростить вашу жизнь программиста, поскольку она предлагает вам такие функции, как отложенная загрузка и отслеживание изменений из коробки. Так что вы можете подумать дважды, если хотите отказаться от этого.
Чтобы узнать, был ли объект клиента изменен или нет, контекст EF может быть полезен, поскольку он отслеживает состояние объекта. Например, вы можете запросить ObjectStateManager для клиента и проверить, находится ли он в состоянии «Изменено». Но чтобы иметь эту опцию, вам нужно будет работать с присоединенными сущностями, как описано выше. Поскольку вы не можете сохранить (или также отменить) изменения одного объекта, сомнительно, чтобы было вообще целесообразно показать пользователю, что клиент 1 и клиент 3 изменились. (Я бы, вероятно, показывал только «некоторые клиенты изменились».)
Если вы работаете с отсоединенными объектами, вам нужно вручную управлять тем, какие клиенты изменились или нет, внедрив какую-то логику «грязного флага». Вот нить об этом:
Различные способы реализации функции «грязного» флага