EF6: How to avoid circular reference?

雨燕双飞 提交于 2019-12-08 06:55:03

问题


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?


回答1:


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)



回答2:


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?



来源:https://stackoverflow.com/questions/38448757/ef6-how-to-avoid-circular-reference

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!