Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebApi 2和EntityFramework,即';ObjectContent`1';类型未能序列化响应正文_C#_Entity Framework_Asp.net Web Api - Fatal编程技术网

C# WebApi 2和EntityFramework,即';ObjectContent`1';类型未能序列化响应正文

C# WebApi 2和EntityFramework,即';ObjectContent`1';类型未能序列化响应正文,c#,entity-framework,asp.net-web-api,C#,Entity Framework,Asp.net Web Api,我正在使用EntityFramework 5.0的MVC5+WebAPI2开发我的第一个web应用程序 在我的应用程序中,我必须显示从数据库提取的事务列表,因此我有一个WebApi控制器,它执行以下操作: [RoutePrefix("api/transaction")] public class TransactionApiController : ApiController { [Route("{userid}/{status}")] [HttpGet] [Au

我正在使用EntityFramework 5.0的MVC5+WebAPI2开发我的第一个web应用程序

在我的应用程序中,我必须显示从数据库提取的事务列表,因此我有一个WebApi控制器,它执行以下操作:

    [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_事务类中的HBTI_员工的财产:

"InnerException":{"Message":"An error has occurred.",
"ExceptionMessage":"Error getting 
value from 'HBTI_Employee1' on 
'System.Data.Entity.DynamicProxies.HBTI_Employee_...
我解决这个问题的方法是创建一个类TransactionViewModel,并从原始TPASS_事务在服务器上创建这种类型的对象,避免使用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;
        }
    }

无论如何,对我的应用程序中的每个模型类都这样做会很乏味,所以我宁愿使用原始对象。我在谷歌上搜索了这个问题,但似乎没有人能给这个问题一个好的答案/解决方案。有人能解释一下这里的错误/我遗漏了什么吗?

看看这个,也许吧:实际上,你对虚拟机的“变通”是一个最佳实践,你应该这样做。您可以使用AutoMapper简化实体转换。@RaphaëlAlthaus感谢Raphaël,这很有用。这意味着我可能需要禁用延迟加载并实现某种类型的分页。@alex.koby您能详细介绍一下这个“自动映射器”吗?不幸的是,我是这类技术的初学者,所以我有点迷路了。非常感谢。AutoMapper是一个方便的库,用于映射类(在您的案例中,实体框架实体到视图模型),您可以在这里阅读更多内容。