Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Chris HolmesОтветов: 1

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

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

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

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

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

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

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

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

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

silverlightpocowcf-ria-services

Ответы

Ответ 1 · рейтинг 1 · J.C.

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

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

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

Что ж...

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

Проблема!

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

So...

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы