检测到实体框架自引用循环 [英] Entity framework self referencing loop detected

查看:30
本文介绍了检测到实体框架自引用循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个奇怪的错误.我正在试验 .NET 4.5 Web API、实体框架和 MS SQL Server.我已经创建了数据库并设置了正确的主外键和关系.

I have a strange error. I'm experimenting with a .NET 4.5 Web API, Entity Framework and MS SQL Server. I've already created the database and set up the correct primary and foreign keys and relationships.

我创建了一个 .edmx 模型并导入了两个表:员工和部门.一个部门可以有很多员工,这种关系是存在的.我使用脚手架选项创建了一个名为 EmployeeController 的新控制器,以使用实体框架创建具有读/写操作的 API 控制器.在向导中,选择 Employee 作为模型和数据上下文的正确实体.

I've created a .edmx model and imported two tables: Employee and Department. A department can have many employees and this relationship exists. I created a new controller called EmployeeController using the scaffolding options to create an API controller with read/write actions using Entity Framework. In the wizard, selected Employee as the model and the correct entity for the data context.

创建的方法如下所示:

public IEnumerable<Employee> GetEmployees()
{
    var employees = db.Employees.Include(e => e.Department);
    return employees.AsEnumerable();
}

当我通过/api/Employee 调用我的 API 时,我收到此错误:

When I call my API via /api/Employee, I get this error:

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":" ...

The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; ...System.InvalidOperationException","StackTrace":null,"InnerException":{"Message":"An error has occurred.","ExceptionMessage":"Self referencing loop detected with type 'System.Data.Entity.DynamicProxies.Employee_5D80AD978BC68A1D8BD675852F94E8B550F4CB150ADB8649E8998B7F95422552'. Path '[0].Department.Employees'.","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":" ...

为什么是自引用 [0].Department.Employees?这没有多大意义.如果我的数据库中有循环引用,我希望会发生这种情况,但这是一个非常简单的示例.可能出什么问题了?

Why is it self referencing [0].Department.Employees? That doesn't make a whole lot of sense. I would expect this to happen if I had circular referencing in my database but this is a very simple example. What could be going wrong?

推荐答案

基于 Json.net 的默认 Json formater 的正确答案是将 ReferenceLoopHandling 设置为 Ignore.

Well the correct answer for the default Json formater based on Json.net is to set ReferenceLoopHandling to Ignore.

只需将其添加到 Global.asax 中的 Application_Start:

Just add this to the Application_Start in Global.asax:

HttpConfiguration config = GlobalConfiguration.Configuration;

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

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

This is the correct way. It will ignore the reference pointing back to the object.

其他响应侧重于通过排除数据或创建外观对象来更改返回的列表,有时这不是一个选项.

Other responses focused in changing the list being returned by excluding data or by making a facade object and sometimes that is not an option.

使用 JsonIgnore 属性来限制引用可能很耗时,而且如果您想从另一个点开始序列化树,这将是一个问题.

Using the JsonIgnore attribute to restrict the references can be time consuming and if you want to serialize the tree starting from another point that will be a problem.

这篇关于检测到实体框架自引用循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆