Silverlight, RIA и POCO: SubmitOperationFailed при ВСТАВКЕ двух новых дочерних сущностей. Сущность с таким же идентификатором существует

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

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

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

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

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

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

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

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


person Chris Holmes    schedule 19.11.2010    source источник
comment
Я понял это. По сути, вам нужно прекратить попытки делать что-то вручную и позволить RIA сделать это за вас.   -  person Chris Holmes    schedule 10.01.2011


Ответы (1)


Вы слишком легко сдались - не позволяйте RIA делать это за вас !! :-)

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

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

Что ж...

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

Проблема!

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

So...

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

person J.C.    schedule 27.04.2011
comment
Да, Иеремия, вот что я понял. Это часть того, что Риа сделает это за вас - только вы должны предоставить ключ, чтобы она могла управлять набором изменений. Хотя было круто изучать RIA. Очень нравится :-) Спасибо! - person Chris Holmes; 28.04.2011