首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >检测到实体框架自引用循环

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

Stack Overflow用户
提问于 2013-10-19 23:26:20
回答 13查看 117.8K关注 0票数 110

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

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

创建的方法如下所示:

代码语言:javascript
复制
public IEnumerable<Employee> GetEmployees()
{
    var employees = db.Employees.Include(e => e.Department);
    return employees.AsEnumerable();
}

当我通过/ API /Employee调用我的api时,我得到了这个错误:

'ObjectContent`1‘类型无法序列化内容类型’'System.Data.Entity.DynamicProxies.Employee_5D80AD978BC68A1D8BD675852F94E8B550F4CB150ADB8649E8998B7F95422552'. /;...System.InvalidOperationException","StackTrace":null,“InnerException”:{“Message”:“发生错误”的响应正文。“,”ExceptionMessage“:”使用类型应用程序检测到自引用循环路径'.Department.Employees'.","ExceptionType":"Newtonsoft.Json.JsonSerializationException","StackTrace":“...

为什么它是自引用.Department.Employees?这并不是很有意义。如果我的数据库中有循环引用,我希望这会发生,但这是一个非常简单的例子。会出什么问题呢?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2015-05-13 08:06:37

对于基于Json.net的默认Json格式器,正确的答案是将ReferenceLoopHandling设置为Ignore

只需将此代码添加到Global.asax中的Application_Start

代码语言:javascript
复制
HttpConfiguration config = GlobalConfiguration.Configuration;

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

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

其他响应集中于通过排除数据或创建外观对象来更改返回的列表,有时这不是一种选择。

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

票数 184
EN

Stack Overflow用户

发布于 2013-10-19 23:29:54

这是因为您试图直接序列化EF对象集合。由于部门与员工和员工与部门有关联,JSON序列化程序将无限循环读取d.Employee.Departments.Employee.Departments等。

要在序列化之前修复此问题,请使用所需的道具创建匿名类型

示例(Psuedo)代码:

代码语言:javascript
复制
departments.select(dep => new { 
    dep.Id, 
    Employee = new { 
        dep.Employee.Id, dep.Employee.Name 
    }
});
票数 54
EN

Stack Overflow用户

发布于 2014-02-25 06:16:36

我也遇到了同样的问题,我发现你可以只将[JsonIgnore]属性应用于你不想序列化的导航属性。它仍然会序列化父实体和子实体,但只是避免了自引用循环。

票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19467673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档