Silverlight & RIA & POCO: SubmitOperationFailed при вставке двух новых дочерних объектов.Объект с таким же идентификатором существует - PullRequest
0 голосов
/ 19 ноября 2010

Вот мой сценарий:

Я использую объекты Silverlight, RIA и POCO (без Entity Framework; мы работаем против Oracle и SP).

У меня есть родительский объект, который содержит коллекцию дочерних объектов. Я правильно настроил атрибуты Ассоциации и Композиции на Родителе. Когда я хочу сохранить изменения, весь граф объектов отправляется на сервер правильно.

Пользователь может добавить один или несколько дочерних объектов в родительский.

Теперь, если пользователь добавляет ОДИН дочерний объект в родительский и сохраняет его, тогда все работает. Однако, когда пользователь пытается добавить ДВА или более новых объектов в Parent, а затем продолжает работу, я получаю классическую ошибку:

System.ServiceModel.DomainServices.Client.DomainOperationException: операция отправки не удалась. Сущность с такой же идентичностью уже существует в этом EntitySet. ---> System.InvalidOperationException: объект с таким же идентификатором уже существует в этом EntitySet.

Теперь, это сбой на клиенте. Я отслеживаю все - база данных фактически обновляется! Все правильно отправляется на сервер, обновляется БД. Я проверяю ключи объектов на сервере, когда повторный запрос происходит, и они верны - все новые дочерние объекты обновляют свои идентификаторы от нуля до действительного числа в последовательности.

Это когда я получаю перезагрузить родительский объект на клиенте, я получаю эту ошибку. Я не понимаю Я обновляю новый контекст для операции повторной загрузки; он должен быть пустым и просто загружать Родителя и связанных с ним детей. Я проверяю данные на стороне сервера, прежде чем они выйдут из метода запроса - родительские и дочерние данные в порядке. Так что же происходит? Почему мой контекст раздражает, что я не могу выполнить эту операцию?

1 Ответ

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

Ты сдался слишком легко - не позволяй РИА сделать это за тебя !! : -)

Вот сделка ...

Поскольку вы работаете с объектами POCO (без EF), у вас, скорее всего, есть атрибут идентификации ([Ключ]) в одном из ваших свойств, обозначающий его как ключ (или идентификатор) этого объекта.

Ну ...

Когда вы добавляете 2 последовательных объекта, скорее всего, значение вашего ключа по умолчанию будет равно 0. Это проблема для службы домена и контекста, поскольку она пытается управлять набором для вас. Хорошо, если после сохранения объектов в базе данных вы не обновили ключ, они оба останутся со значением 0.

Проблема!

Служба домена и контекст пытаются поместить эти два объекта в управляемый им EntitySet, и поэтому все объекты должны быть уникальными.

Итак ...

Длинна и коротко ... обновите значение ключа после сохранения его в базе данных.

...