ApiController可以返回带有其他对象集合的对象吗?
如果我有一个只有简单属性的Customer
类(例如Name
等),那么我可以创建一个派生自ApiController
,并使用URL /api/customers
查询我的Customer对象。
类似地,如果我有一个具有简单属性的Order
类( Description
, Amount
),那么我可以创建一个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();
完成工作,谢天谢地没有多少代码可写。
- 将json对象发布到ASP MVC无法正常工作
- Html.DropDownList选择的值不起作用(使用带有IEnumberable 的构造函数)
- 使用dropdownlist时Asp.net mvc ModelState的有效性
- 是否可以在MVC 4 AuthorizeAttribute中使用async / await?
- Windows 10更新后,MVC应用程序中断
- 如何将资源字符串组合用于validation属性错误消息?
- UrlHelper.Action包含不需要的附加参数
- 在mvc ef中为显示名称动态选择两个标签
- 如何在ASP.Net MVC中将RDLC报告与ReportViewer Control一起使用?