使用导航属性发布新实体

时间:2014-10-16 15:49:46

标签: c# entity-framework asp.net-web-api odata asp.net-web-api2

我正在努力寻找一个如何在涉及导航属性时为OData v4服务创建(POST)新实体的示例。

例如,假设我有以下两种模式:

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),那么我将POST:

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

我需要为群组指定什么?我假设我需要通过ID以某种方式引用它。当然,我可以在Item实体(GroupId)中包含外键并添加它。这就是我现在正在做的事情,它有效,但这是唯一的方法吗? 应该我在做什么?感谢。

2 个答案:

答案 0 :(得分:2)

像这样嵌套你的JSON:

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

答案 1 :(得分:0)

这应该有效:

POST http://host/service/Items
{"@odata.type":"#{YourSchemaNameSpace}.Item",
    "ID":111,
    "Name":"New item",
    "Groups@odata.bind":[
        "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",
    "Categories@odata.bind":[
       "http://services.odata.org/V4/OData/(S(nycqcplahy351amirlopon50))/OData.svc/Categories(1)"
    ]
}

并且有效。