我正在使用带有EntityFramework 5.0的MVC5 + WebAPI2开发我的第一个Web应用程序。
在我的应用程序中,我必须显示从数据库中提取的事务列表,因此我有一个WebApi Controller,它执行以下操作:
[RoutePrefix("api/transaction")]
public class TransactionApiController : ApiController
{
[Route("{userid}/{status}")]
[HttpGet]
[Authorize]
public TPASS_Transaction[] getTransactions(string userid, int status) {
using (var ec = new TelepassEntities()) {
TPASS_Transaction[] transactions = ec.TPASS_Transaction
.Where(t => t.TransactionOwner.EndsWith(userid) && t.Status == status)
.ToArray();
return transactions;
}
}
}
然而,在客户端我收到一个错误:' ObjectContent`1'类型无法序列化响应正文。看起来这是由于TPASS_Transaction类中的属性HBTI_Employee:
"InnerException":{"Message":"An error has occurred.",
"ExceptionMessage":"Error getting
value from 'HBTI_Employee1' on
'System.Data.Entity.DynamicProxies.HBTI_Employee_...
我解决这个问题的方法是创建一个TransactionViewModel类,并在服务器上从原始的TPASS_Transaction创建这种类型的对象,避免使用HBTI_Employee属性:
[Route("{userid}/{status}")]
[HttpGet]
[Authorize]
public TransactionVM[] getTransactions(string userid, int status) {
using (var ec = new TelepassEntities()) {
TransactionVM[] transactions = ec.TPASS_Transaction
.Where(t => t.TransactionOwner.EndsWith(userid) && t.Status == status)
.Select(t => new TransactionVM()
{
//all properties of TPASS_Transaction
//but HBTI_Employee
}).ToArray();
return transactions;
}
}
无论如何,在我的应用程序中为每个模型类执行它会很繁琐,所以我宁愿使用原始对象。我搜索了这个问题,但似乎没有人给出这个问题的好答案/解决方案。任何人都可以解释我错在哪里/我在这里缺少什么?