Как обновить свойство навигации для объекта с составным ключом? - PullRequest
1 голос
/ 01 августа 2011

У меня проблема с использованием служб данных WCF для объекта, который имеет составной первичный ключ. Я использую шаблон бизнес-приложения Silverlight 4 и создал модель данных объекта (EDM) для базы данных для соответствующих таблиц и создал службу данных WCF для этого EDM в веб-проекте. Проект Silverlight имеет ссылку на службу данных службы WCF. Пока все довольно стандартные вещи:)

Ради простоты и легкости отладки я сузил это до очень простого сценария:

  • Lookup таблица содержит столбцы Id и Data.
  • Lookup2 таблица содержит столбцы Id и Data.
  • MyData таблица содержит столбцы LookupId, Lookup2Id, SomeDate и ExtraData.
    • LookupId - это внешний ключ таблицы Lookup.
    • Lookup2Id - это внешний ключ таблицы Lookup2.
    • Столбцы LookupId, Lookup2Id и SomeDate образуют первичный ключ для таблицы MyData.

Затем я могу загрузить данные из справочных таблиц в отдельные CollectionViewService с, используя отдельные DataServiceCollection с. Я также загружаю основные данные в другой CollectionViewSource через третий DataServiceCollection. Для свойства ItemsSource в элементах управления ComboBox я привязываюсь к соответствующему CollectionViewSource, а затем привязываю свойство SelectedItem к соответствующему свойству навигации. Пока все работает нормально.

Затем я добавляю кнопку Сохранить изменения с обработчиком Click, который вызывает BeginSaveChanges. Если я изменяю значение поля ExtraData, а затем нажимаю Сохранить изменения , изменения сохраняются без проблем. Однако, если я изменяю значение одного из свойств навигации, я получаю исключение при вызове BeginSaveChanges:

Ошибка обработки потока запросов. Обнаружена ошибка при установке значения для свойства «Lookup». Пожалуйста, проверьте правильность значения.

Если еще больше упростить EDM, чтобы внешний ключ не являлся частью составного ключа, изменения можно успешно сохранить, однако составной ключ в реальном приложении является важной частью модели данных.

Есть предложения о том, что я делаю неправильно, и как изменить свойство навигации, которое является частью составного ключа?

Спасибо, Дерек.

1 Ответ

2 голосов
/ 01 августа 2011

Изменение ключевого свойства объекта в OData невозможно. Основная причина в том, что это изменит идентичность сущности, но вся система предполагает, что идентичность никогда не меняется. С точки зрения OData изменение идентичности - это то же самое, что удаление существующего свойства и добавление нового (другого). Это также означало бы, что URL-адрес сущности изменяется, что не очень подходит для клиентов. Без модели я не знаю, почему это не так, как для вас, но службы данных WCF в любом случае не позволят вам напрямую изменить свойство ключа.

...