我试图创建一个方法来GET和POST一个包含事务列表的对象。问题似乎是如果列表项包含标有[Key]属性的主键,它们将不再被Microsoft OData框架识别,并立即从OData JSON输出中消失(但在常规REST API上仍然可见)
参考下面的代码,如果我不在Bone类中放置[Key] atttribute,那么这里是JSON输出:
{
"@odata.context":"http://localhost/odata/$metadata#PuppyDogs",
"value":[
{
"Name":"Fido",
"Bones":[
{
"ChewType":"Soft",
"Numberofchews":1
},
{
"ChewType":"Hard",
"Numberofchews":2
}
]
}
]
}
...但是只要将[Key]添加到Bone类,列表就会消失:
{
"@odata.context":"http://localhost/odata/$metadata#PuppyDogs",
"value":[
{
"Name":"Fido"
}
]
}
如何让一个包含带键的其他对象的对象?到目前为止,我还没有在网上找到任何这方面的工作示例,但我认为这是一个非常常见的用例(例如包含订单项的订单等)。
使用其他人的代码演示:
public class PuppyDogs
{
public string Name { get; set; }
public IList<Bone> Bones { get; set; }
}
public class Bone
{
[Key] // if this line is here, the list of Bones disappears from the JSON
public int BoneID {get;set;}
public string ChewType { get; set; }
}
控制器类看起来像:
public class PuppyDogController : ODataController
{
List<PuppysDog> mydogs = new List<PuppysDog>();
private PuppyDogController()
{
if (mydogs.Count == 0)
{
PuppysDog mydog = new PuppysDog();
mydog.Name = "Fido";
mydog.Bones = new List<Bone>()
{
new Bone{ ChewType = "Soft"},
new Bone{ ChewType = "Hard"}
};
mydogs.Add(mydog);
}
}
[EnableQuery]
public IQueryable<PuppysDog> Get()
{
return mydogs.AsQueryable();
}
}