1

Я пытаюсь найти пример создания (POST) нового объекта службе OData v4, когда есть свойство навигации.POSTing нового объекта с навигационным свойством

Например, предположим, что у меня есть следующие две модели:

class Item 
{ 
    [Key] 
    public int Id { get; set; } 

    [Required] 
    public string Name { get; set; } 

    [Required] 
    public virtual Group Group { get; set;} 
} 

class Group 
{ 
    [Key] 
    public int Id { get; set; } 

    [Required] 
    public string Name { get; set; } 
} 

Если я хочу, чтобы создать элемент, который должен принадлежать к уже определенной группе (с, скажем, ID = 123), то я отправлю:

{ 
    "Name": "New item", 
    "Group": ??? 
} 

Что необходимо указать для группы? Я предполагаю, что мне нужно как-то ссылаться на него по ID. Конечно, я мог бы включить внешний ключ в объект Item (GroupId) и добавить его. Вот как я это делаю сейчас, и это работает, но это единственный способ пойти? Что должен Я делаю? Благодарю.

ответ

1

Просто гнездо ваш JSON как это:

{ 
    "Name": "New item", 
    "Group": 
    { 
     "Id": 5, 
     "Name": "GroupName" 
    } 
} 
+0

Действительно ли это работает? Свойство Group.Name кажется излишним, кроме того, что требуется проверка «Имя требуется». С более крупными объектами и более сложными отношениями я вижу, что этот простой запрос становится огромным. – Barguast

+0

[Эта часть спецификации OData v4] (http://docs.oasis-open.org/odata/odata/v4.0/errata01/os/complete/part1-protocol/odata-v4.0-errata01-os -part1-protocol-complete.html # _Toc399426823), похоже, относится к тому, что я пытаюсь сделать. К сожалению, на самом деле это не работает. Я также разместил об этом на своем дискуссионном форуме Codeplex. – Barguast

+0

Так вы это делаете, но вам не нужно включать свойства, которые уже существуют в базе данных, или свойства, которые не требуются (с нулевым значением или с ограничениями по умолчанию). Предполагая, что у Группы есть внешний ключ для элемента, просто добавление объекта «Группа» в ваш JSON делает привязку автоматически. –

0

Это должно работать:

POST http://host/service/Items 
{"@odata.type":"#{YourSchemaNameSpace}.Item", 
    "ID":111, 
    "Name":"New item", 
    "[email protected]":[ 
     "http://host/service/Groups(123)" 
    ] 
} 

Я проверил шаблон со службы образца: http://services.odata.org/V4/(S(readwrite))/OData/OData.svc/ запрашивая так:

POST http://services.odata.org/V4/OData/(S(nycqcplahy351amirlopon50))/OData.svc/Products 
{"@odata.type":"#ODataDemo.Product", 
    "ID":111, 
    "Name":"New product", 
    "[email protected]":[ 
     "http://services.odata.org/V4/OData/(S(nycqcplahy351amirlopon50))/OData.svc/Categories(1)" 
    ] 
} 

и он сработал.

+0

Спасибо. Поскольку моя «группа» не является коллекцией, я адаптировал ее к «[email protected]»: «http: // localhost: 5445/group (1)». URL-адрес группы действителен, но я получаю сообщение об ошибке в моем POST-поле: «Поле« Группа »обязательно». Постановка контрольной точки в моем контроллере товаров показывает, что свойство Group действительно равно нулю. Помещение другой точки останова в GET (x) моего группового контроллера показывает, что это тоже не называется. Есть что-то еще, что мне нужно сделать? – Barguast

+0

@Barguast Поскольку ваша «группа» не является коллекцией, помимо адаптации к «[email protected]», вам также необходимо удалить квадратные скобки вокруг ссылки на группу, поскольку они представляют массив. –

+0

Я сделал это - свойство [email protected] - это просто URL-адрес группы. По-прежнему, похоже, это не разрешимо - свойство Group в контроллере просто кажется нулевым. – Barguast

Смежные вопросы