В ObjectContext добавлен неверный объект (_addedEntityStore) - PullRequest
1 голос
/ 30 августа 2010

У меня есть мастер в моем приложении asp.net MVC, которое построено на этом руководстве мастера SoG - RESTFUL .

Чтобы понять проблему, я сначала объясню ситуацию ниже.Для этого я буду использовать фиктивную ситуацию, мы попытаемся создать человека с адресом.Опять же, это просто фиктивная ситуация!

Ситуация

При запуске объект (человек), который будет создан и сохранен с помощью мастера, будет создан как пусто объект (человек) и будет заполнено во время «этапа» мастера.Между различными шагами мастера объект персоны сохраняется в СЕССИИ и извлекается с помощью ключа.Этот объект имеет отношение с подобъектом.Например, адрес.Этот адрес можно получить из БД с помощью раскрывающегося меню в мастере или можно создать в самом мастере.Это означает, что при создании я создам пустой адресный объект , поэтому мы имеем следующую инициализацию:

Persons p = new Persons();
p.Addressess = new Addressess()

Этот объект передается в FormViewModel и используется в форме мастера.Здесь у меня есть раскрывающийся список, позволяющий выбрать: (1) «создать новый адрес для человека», который заполняет переданный объект пустого адреса данными обычными способами (TryUpdateModel ()) и (2) «адрес х»,адреса для выбора из вашей БД.

Выбор одного из адресов в раскрывающемся списке в методе POST контроллера извлечет этот объект из БД и свяжет его с лицом. Адреса. В коде:

p.Addresses = repository.GetContactByID(id);

Проблема

Все работает нормально при работе через страницы мастера. Проблема возникает, когда я вызываю savechanges (). Во время финального обзора полный объект, который будет добавлен, отображается правильно (информация о человеке + информация об адресе, как выбрано / передано), а также пустой адрес сохраняется в базе данных.

repository.SaveChanges();

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

** Моя текущая идея ** Моя текущая мысльДело в том, что пустой объект, созданный в начале для пустого объекта, каким-то образом помещается в добавленное состояние (objectcontext), когда я впервые связываю его с person.Addresses.Может ли это быть так?Как правильно сделать то, что я хочу?Могу ли я вручную удалить объекты из контекста объекта _addedEntityStore?

Дополнительная информация

Выбор адреса в раскрывающемся списке будет force form.submitв метод POST-контроллера и последовательно он перезагрузит форму с обновленной информацией выбора и полями ввода для нового адреса (если требуется новый), установленным на «отключен», так что вы видите только информациюно не может редактировать существующий адрес.

Кроме того, используется только один objectContext , который сохраняется в СЕССИИ.

Ответы [ 2 ]

1 голос
/ 30 августа 2010

По какой причине вы не можете просто оставить p.Addressess как ноль при первом создании объекта Persons и добавить новый адрес, только если это то, что они выбрали в мастере?

(И кстати, почему странное множественное число? У них есть один или несколько адресов?)

Другая проблема, с которой вы столкнетесь, заключается в том, что вы будете загружать существующие адреса в одном контексте и сохранять их вдругой (при условии, что вы используете подход «контекст для запроса») - вам нужно будет отсоединить существующие адреса от одного контекста, в который они были загружены, и присоединить их к контексту, который использовался для сохранения Person в конце мастера.

Может быть проще включить отдельный объект AddressNew и AddressExisting в состояние сеанса (один или другой имеет значение null).В конце, если присутствует AddressNew, добавьте его к Person и сохраните изменения.Если присутствует AddressExisting, присоедините его к контексту, добавьте его к Person и сохраните изменения.

0 голосов
/ 31 августа 2010

Хотя Hightechrider прав в использовании контекста объекта для каждой единицы работы, я выкладываю простое решение, которое я использовал на данный момент.Когда вы каким-то образом (принудительно, выбрали, что угодно) сохраняете контекст своего объекта в SESSION, вы можете решить вышеуказанную проблему, просто вызвав:

repository.Detach(person.Addresses) 

, который отсоединит старый объект от контекста (еще не сохраненный вБД).А после отсоединения прикрепите новый объект, с которым вы хотите связать его.

person.Addresses = repository.GetAddressByID(id);
// or
person.Addresses = new Addresses();

Хотя я действительно рекомендую переписать ваш мастер, если вам нужно это сделать, и у вас есть время и сила:).

edit

обратите внимание, что Detach отсоединяет только предоставленный объект, а не связанные с ним объекты (!).

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