我有一个奇怪的错误。我正在尝试使用.NET 4.5 Web API,实体框架和MS SQL Server。我已经创建了数据库并设置了正确的主键和外键以及关系。
我创建了一个.edmx模型并导入了两个表:Employee和Department。一个部门可以有很多员工,并且这种关系存在。我使用脚手架选项创建了一个名为EmployeeController的新控制器,以使用Entity Framework创建具有读/写操作的API控制器。在向导中,选择Employee作为模型和数据上下文的正确实体。
创建的方法如下所示:
public IEnumerable<Employee> GetEmployees() { var employees = db.Employees.Include(e => e.Department); return employees.AsEnumerable(); }
通过/ api / Employee调用API时,出现以下错误:
‘ObjectContent`1’类型未能序列化内容类型’application / json的响应主体;… System.InvalidOperationException“,” StackTrace“:null,” InnerException“:{” Message“:”发生错误。“,” ExceptionMessage“:”检测到类型为’System.Data.Entity.DynamicProxies的自引用循环.Employee_5D80AD978BC68A1D8BD675852F94E8B550F4CB150ADB8649E8998B7F95422552’。路径’[0] .Department.Employees’。“,” ExceptionType“:” Newtonsoft.Json.JsonSerializationException“,” StackTrace“:” …
为什么自引用[0] .Department.Employees?这没有任何意义。如果在数据库中有循环引用,我希望会发生这种情况,但这是一个非常简单的示例。可能出什么问题了?
好吧,基于Json.net的默认Json格式器的正确答案是设置ReferenceLoopHandling为Ignore。
ReferenceLoopHandling
Ignore
只需将其添加到Application_StartGlobal.asax中:
Application_Start
HttpConfiguration config = GlobalConfiguration.Configuration; config.Formatters.JsonFormatter .SerializerSettings .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
这是正确的方法。它将忽略指向该对象的引用。
其他响应的重点是通过排除数据或制作门面对象来更改返回的列表,有时这不是选择。
使用JsonIgnore属性限制引用可能很耗时,并且如果您要从另一个角度开始对树进行序列化,那将是一个问题。
JsonIgnore