一尘不染

实体框架自引用循环检测到

c#

我有一个奇怪的错误。我正在尝试使用.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?这没有任何意义。如果在数据库中有循环引用,我希望会发生这种情况,但这是一个非常简单的示例。可能出什么问题了?


阅读 248

收藏
2020-05-19

共1个答案

一尘不染

好吧,基于Json.net的默认Json格式器的正确答案是设置ReferenceLoopHandlingIgnore

只需将其添加到Application_StartGlobal.asax中:

HttpConfiguration config = GlobalConfiguration.Configuration;

config.Formatters.JsonFormatter
            .SerializerSettings
            .ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

这是正确的方法。它将忽略指向该对象的引用。

其他响应的重点是通过排除数据或制作门面对象来更改返回的列表,有时这不是选择。

使用JsonIgnore属性限制引用可能很耗时,并且如果您要从另一个角度开始对树进行序列化,那将是一个问题。

2020-05-19