实体框架/ Web Api无法检索关联结果

时间:2014-03-26 23:53:19

标签: asp.net entity-framework asp.net-web-api

我正在尝试使用Entity Framework和WebAPI将数据检索为XML。 我得到的只是一个空的Child容器,我在OrderItem中填充了两条记录,OrderId = 1但仍然没有,请参阅下面的<OrderItems/>

<ArrayOfOrder xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/WebApplication6.Models">
<Order>
<ID>1</ID>
<OrderItems/>
<Username>Test</Username>
</Order>
</ArrayOfOrder>

我的订单模型如下:

public class Order
{
    public Order()
    {
        this.OrderItems = new HashSet<OrderItem>();
    }
    public int Id { get; set; }
    public string Username { get; set; }
    public ICollection<OrderItem> OrderItems { get; set; }

}

我的OrderItems模型如下:

public class OrderItem
{
    public int Id { get; set; }
    public int OrderId { get; set; }
    public int Qty { get; set; }
    public Order Order { get; set; }

}

GetOrders的控制器代码:

    // GET api/Order
    public IQueryable<Order> GetOrders()
    {
        return db.Orders;
    }

我只是想学习实体框架和WebApi,这部分似乎是基本的功能,我在基础层面找不到任何可靠的参考。谁能解释我错过的东西?

1 个答案:

答案 0 :(得分:0)

经过几个小时的搜索,我找到了解决方案。基本上我需要包含子数据集。这是在控制器功能中完成的:

public IQueryable<Order> GetOrders()
{
    return db.Orders.Include(p => p.OrderItems);
}

然而,这引入了错误:

  

类型的对象图   “System.Collections.Generic.HashSet`1 [[WebApplication7.Models.OrderItem,   WebApplication7,Version = 1.0.0.0,Culture = neutral,   PublicKeyToken = null]]'包含循环,如果不能序列化   参考跟踪已禁用。

使用Datacontracts为XML修复了这个问题 更新了OrderItem模型:

using System.Runtime.Serialization;
[DataContract]
public class OrderItem
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public int OrderId { get; set; }
    [DataMember]
    public int Qty { get; set; }
    public Order Order { get; set; }

}

注意在订单之前没有[DataMember]注释 现在我的结果符合预期:

<ArrayOfOrder xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/WebApplication7.Models">
<Order>
 <Id>1</Id>
 <OrderItems>
  <OrderItem>
   <Id>2</Id>
   <OrderId>1</OrderId>
   <Qty>231</Qty>
  </OrderItem>
  <OrderItem>
   <Id>4</Id>
   <OrderId>1</OrderId>
   <Qty>2314</Qty>
  </OrderItem>
 </OrderItems>
 <Username>first</Username>
</Order>
</ArrayOfOrder>