EF6: How to avoid circular reference?

asp.net-web-api c# entity-framework-6 json


What are the possibilities to avoid circular reference with Entity Framework 6 during JSON serialization with ASP.NET Web API?

I generated a edmx (Entity Data Model) file for Entity Framework 6, database first. I try to build an API with ASP.NET Web API. When I try to return my JSON object in my controllers I get a runtime exception of serialization because of circular reference.

Indeed when I double check my database and my entities I see one of my entity contains a list another entity that contain a list of my previous entity. let say I have a book entity that contains authors and each author entity contains a list of books. This is something common with relative database but impossible to resolve in JSON serialization (or impossible to resolve for the .NET serializer).

I don't want to change my database but I'm ready to break the wrong list into my entities or edmx file. What can I do?

What I have tried:

I already tried the solution that consist of creating new models or entities and using a mapping tool (http://www.codeproject.com/Articles/292970/Avoiding-Circular-Reference-for-Entity-in-JSON-Ser or the solution explained by by Shawn Wildermuth on Pluralsight).

This solution sounds more like a workaround than a real solution. It should exist something in edmx file or in Entity Framework to tell the JSON serializer what can cause circular reference, what can and must be serialized and what cannot be serialized, right?

7/19/2016 2:43:28 AM

Accepted Answer

There is technically no problem to serialize the domain model directly. To avoid circular reference you cannot use lazy loading. You must keep control of the loading. To do so

  1. remove the virtual before each collection of your model (in code first approach)
  2. set lazy loading configuration to false (in database first approach)
10/3/2016 5:00:31 AM

Popular Answer

Don't try to serialize your domain model directly. Create a view model that returns the data in the exact format you want. Use you domain model to populate the view model. Much more information here Why do we use ViewModels?

Related Questions


Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow