EF6:如何避免循环引用?

Bas*_*mme 1 c# json asp.net-web-api entity-framework-6

在使用ASP.NET Web API进行JSON序列化期间,避免使用Entity Framework 6进行循环引用的可能性有哪些?

我首先为数据库Entity Framework 6生成了edmx(实体数据模型)文件。我尝试使用ASP.NET Web API构建API。当我尝试在控制器中返回JSON对象时,由于循环引用,我遇到了序列化的运行时异常。

确实,当我仔细检查数据库和实体时,我看到一个实体包含一个列表,另一个实体包含了先前实体的列表。假设我有一个包含作者的图书实体,每个作者实体均包含一个图书列表。这在相对数据库中很常见,但无法在JSON序列化中解决(或无法为.NET序列化器解决)。

我不想更改数据库,但已准备好将错误的列表分解为实体或edmx文件。我能做什么?

我尝试过的

我已经尝试过由创建新模型或实体以及使用映射工具(http://www.codeproject.com/Articles/292970/Avoiding-Circular-Reference-for-Entity-in-JSON-Ser或Shawn Wildermuth在Pluralsight上解释的解决方案)。

与实际解决方案相比,此解决方案听起来更像是一种解决方法。它应该在edmx文件或Entity Framework中存在一些内容,以告诉JSON序列化程序哪些会导致循环引用,哪些可以并且必须序列化,哪些不能序列化,对吗?

Bas*_*mme 6

从技术上讲,直接序列化域模型没有问题。为了避免循环引用,您不能使用延迟加载。您必须控制加载。这样做

  1. 在模型的每个集合之前删除虚拟对象(采用代码优先方法)
  2. 将延迟加载配置设置为false(采用数据库优先方法)