我正在尝试使用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,这部分似乎是基本的功能,我在基础层面找不到任何可靠的参考。谁能解释我错过的东西?
答案 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>