Модель представления услуг RIA с отношениями 1-много или много-много - PullRequest
0 голосов
/ 28 января 2010

Я пытаюсь заставить модель презентации (обсуждаемую здесь и здесь ) работать в RIA. Все примеры, которые я могу найти, являются простыми, плоскими объектами данных без отношений 1-многие или многие-многие, с которыми я не могу работать, в частности, над обновлениями и вставками в ассоциативные отношения.

Запросы. Я могу нормально работать - у меня есть свои классы презентаций, помеченные с помощью атрибутов Association (и, в случае необходимости, атрибутов Include), и я хорошо понимаю, как данные загружаются на клиентскую сторону и поддерживаются там как сущности. У меня также есть вставки новых лиц покрыты. Тем не менее, я испытываю следующие проблемы. В следующих примерах предположим, что у нас есть простые сущности Album и Artist, где в Album есть один исполнитель, а Artist может иметь от нуля до нескольких альбомов. Оба имеют свойство Name.

  • На стороне клиента, если я сделаю myArtist.Albums.Add (anAlbum) или myArtist.Albums.Remove (anAlbum), ничего не произойдет. HasChanges возвращает false. (Обратите внимание, что myArtist и anAlbum были получены исключительно в коде путем загрузки сущностей и итерации для получения ссылок на конкретные сущности: я пока ничего не делаю в пользовательском интерфейсе или с DomainDataSources, просто бездельничая).
  • Если я обновлю Имя на Artist и SubmitChanges, когда метод Update будет вызван на сервере, коллекция Albums будет нулевой.

У кого-нибудь есть какие-либо предложения, или вы можете указать мне пример, в котором используются более сложные объекты?

РЕДАКТИРОВАТЬ (сохраняя вышесказанное для потомков): Хорошо, похоже, что вторая проблема (ссылка на сущность или набор сущностей, отображаемых как нулевые, когда Update вызывается на сервере) существует, потому что дочерние объекты не помечены как измененные, поэтому они не сериализуются и не отправляются обратно. Я знаю, что вы можете заставить это произойти, используя [Композиция], и я заставил его работать таким образом, но это не композиционные отношения, и я хочу, чтобы обе сущности были сущностями «верхнего уровня». Как я могу пометить объект как измененный?

1 Ответ

1 голос
/ 30 января 2010

Проблема заключалась в том, что мои атрибуты [Ассоциации] не были правильно определены. Я не осознавал, что свойство Name ассоциации должно быть одинаковым на обеих сторонах ассоциации. Когда имена совпадают, и вы выполняете сборку, сгенерированный код на клиенте использует конструктор EntityCollection, используемый «parent» для ссылки на «потомков», чем если не установлены правильные ассоциации , Новый конструктор принимает обратные вызовы, которые делают немного больше обработки, когда вы вызываете Add и Remove для коллекции - в частности, они принимают дочернюю сущность, которую вы добавляете или удаляете, и изменяют свойство, которое ссылается на его родителя, чтобы все оставалось в синхронизации: коллекция, из которой вы удалили объект, коллекция, в которую вы добавили его, и ссылка объекта на его родителя.

...