实体框架自我参照循环检测 [英] Entity framework self referencing loop detected

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

问题描述

我有一个奇怪的错误。我与.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和进口两个表:员工和部门。一个部门可以有多个员工和这种关系的存在。我创建了一个用脚手架选项来创建具有读取API控制器/写使用实体框架的行动称为EmployeeController新控制器。在向导中,选择员工作为模型和正确的实体数据上下文。

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.

这是创建的方法是这样的:

The method that is created looks like this:

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

当我通过/ API /员工打电话给我的API,我得到这个错误:

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

在'ObjectContent`1类型没有序列化内容类型应用程序/ JSON响应主体; ... System.InvalidOperationException,堆栈跟踪:空的InnerException:{消息:发生错误,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格式化器的正确答案是设置 ReferenceLoopHandling 忽略

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 what to serialize de tree starting from another point that will be a problem.

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

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