将集合发布到OData Controller不会将嵌套集合属性返回给客户端

时间:2017-03-01 05:26:14

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

我定义了以下Model类:

public class LinePostModel
    {
        [Key]
        public int OrderId { get; set; }
        public IList<OrderLine> OrderLines { get; set; }
    }

和我的OData控制器上的这个方法:

public async Task<IHttpActionResult> Post(LinePostModel model)
{
  //validae model and its OrderLines collection and save to repo.

  return Created(model);
}

服务器正确接收模型对象,并处理每个查找。我的问题是返回给客户端的RESPONSE只包含原始的OrderId属性,并且不包含集合属性OrderLines。

如何解决这个问题,以便将整个复杂对象返回给客户端?

编辑:添加样本json:

以下是客户发布的内容:

{
      orderId:4,
      orderLines: [
        {
            lineType: "S",
            orderQty: 10,
            priceCode: "D",
            stockCode: "62.C6W026A.050",
            warehouse: "GS",
            orderId:4
        },
        {
            lineType: "S",
            orderQty: 20,
            priceCode: "D",
            stockCode: "62.C6W026A.060",
            warehouse: "GS",
            orderId:4
        }
      ]
}

以下是客户端从服务器收到的内容:

{
  "@odata.context": "http://localhost:4095/$metadata#OrderLines/$entity",
  "orderId": 4
}

我尝试更改服务器以返回Ok(model)而不是Created(model),但这没有任何区别。

控制器方法中return Created(model)行的断点显示,此时模型对象肯定包含OrderLines的集合。

6 个答案:

答案 0 :(得分:0)

没有足够的信息继续下去,但如果您使用Entity Framework保存到repo,请记住在检索已保存的记录时添加.Include()以返回子记录。

答案 1 :(得分:0)

我认为你应该尝试这个答案,看看这是否有帮助。 https://stackoverflow.com/a/16472870/1233465

您可以尝试在请求中添加接受标头,看看是否有帮助。请分享您的结果和发现。

答案 2 :(得分:0)

如果您不需要父类,您只需返回List&lt; orderLines&gt;。

return Created(model.orderLines);

当其他人提到他们返回的字符串是整个复杂对象的JSON序列化时,我意识到了这一点。如果他们可以返回字符串,我可以返回List&lt; childObject&gt;。

答案 3 :(得分:0)

OrderLine是实体还是复杂属性?

您需要确保WebApiConfig.cs中定义的EDM模型具有正确映射的上述关系。对于初学者,您应该在运行时检查/ $ metadata。

如果EDM模型之间没有正确的关系,则ODATA管道将删除多余的信息。

答案 4 :(得分:0)

我有同样的问题。对我而言,OrderLine被定义为实体类型。同一类型不能同时是实体类型和复杂类型,因为复杂类型没有'Id'属性。确保未将OrderLine设置为EntityType。如果这样不起作用,请尝试将其明确设置为“ ComplexType”。

答案 5 :(得分:0)

是的,我遇到同样的问题,请尝试以下操作: http:// localhost:4095 / odata / LinePostModel?$ expand = OrderLines enter image description here