Entity framework self referencing loop detected [duplicate]
Solution 1:
Well the correct answer for the default Json formater based on Json.net is to set ReferenceLoopHandling
to Ignore
.
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.
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.
Solution 2:
This happens because you're trying to serialize the EF object collection directly. Since department has an association to employee and employee to department, the JSON serializer will loop infinetly reading d.Employee.Departments.Employee.Departments etc...
To fix this right before the serialization create an anonymous type with the props you want
example (psuedo)code:
departments.select(dep => new {
dep.Id,
Employee = new {
dep.Employee.Id, dep.Employee.Name
}
});
Solution 3:
I had same problem and found that you can just apply the [JsonIgnore]
attribute to the navigation property you don't want to be serialised. It will still serialise both the parent and child entities but just avoids the self referencing loop.
Solution 4:
I'm aware that question is quite old, but it's still popular and I can't see any solution for ASP.net Core.
I case of ASP.net Core, you need to add new JsonOutputFormatter
in Startup.cs
file:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.OutputFormatters.Clear();
options.OutputFormatters.Add(new JsonOutputFormatter(new JsonSerializerSettings()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
}, ArrayPool<char>.Shared));
});
//...
}
After implementing it, JSON serializer will simply ignore loop references. What it means is: it will return null instead of infinitely loading objects referencing each other.
Without above solution using:
var employees = db.Employees.ToList();
Would load Employees
and related to them Departments
.
After setting ReferenceLoopHandling
to Ignore
, Departments
will be set to null unless you include it in your query:
var employees = db.Employees.Include(e => e.Department);
Also, keep in mind that it will clear all OutputFormatters, if you don't want that you can try removing this line:
options.OutputFormatters.Clear();
But removing it causes again self referencing loop
exception in my case for some reason.