ApiController可以返回带有其他对象集合的对象吗?

如果我有一个只有简单属性的Customer类(例如Name等),那么我可以创建一个派生自ApiController ,并使用URL /api/customers查询我的Customer对象。

类似地,如果我有一个具有简单属性的Order类( DescriptionAmount ),那么我可以创建一个OrdersController并以相同的方式访问它。

但是,如果我然后向Customer类添加一个属性,该属性列出与该Customer关联的Order

 public class Customer { public int Id { get; set; } public string Name { get; set; } // ... public virtual ICollection Orders { get; set; } } 

…然后当我尝试使用/api/customers进行查询时,我得到500服务器错误。 我可以在CustomersController放置一个断点,并且可以看到它确实调用了正确的方法,并尝试返回一个值。 但是,在框架的内容中,它无法将其转换为HTTP响应。

看起来它无法序列化Orders信息和/或打包它以获得HTTP响应,但我不确定我需要做些什么来实现这一点。 或者仅仅是WebApi的东西不是为了返回复杂的对象而设计的?


更新 :我的代码在这里: https : //gist.github.com/43ed2f29f8adfb44cef6


更新2 :有关我得到的错误的更多信息:

 Server error The website encountered an error while retrieving http://localhost:1031/api/customers/6. 

它可能已关闭以进行维护或配置不正确。 以下是一些建议:稍后重新加载此网页。 HTTP错误500(内部服务器错误):服务器尝试完成请求时遇到意外情况。

Intellitrace日志显示以下内容: http : //i.imgur.com/iHxJl.png

[我简直不敢相信Intellitrace窗口不允许我复制文本,因此我必须实际打印屏幕并上传图像。 这是哪一年?]


相关: ASP.Net Web API在VS中正确显示但给出了HTTP500

您正在传递将导致问题的entity framework实体。 您需要数据传输对象来传递和接收数据。 因为您将实体绑定在一起,所以它不允许您序列化数据。

好的,为回答我自己的问题道歉,特别是在我收到的所有帮助之后(感谢tugberk),但有一个简单的(r)解决方案。

正如tugberk指出的那样,问题是我使用Entity Framework代码优先使用我的POCO对象。 当框架尝试序列化我的对象时,它正在序列化EF代理类而不仅仅是POCO对象。

Tugberk建议使用DTO传递和接收数据(基本上是为此目的创建新类),但我真的不想这样做,因为我的POCO类看起来非常适合我,并且重复的类看起来不是很干。

然后我发现(通过https://stackoverflow.com/a/11386206/98422 )我可以关闭我控制器中DbContext的代理生成(如下所示),这会导致POCO对象被序列化而不是代理类 – 从而避免500错误:

 db.Configuration.ProxyCreationEnabled = false; 

但这只是解决方案的50%,因为虽然这避免了错误,但它没有包含子对象的任何数据。 (那些在XML中以nil表示)。 那是因为我的POCO类被设置为通过EF进行延迟加载。 为了解决这个问题,我必须显式加载子对象:

 return db.Customers.Include("Orders").AsEnumerable(); 

完成工作,谢天谢地没有多少代码可写。