EF6:如何避免循环引用?

时间:2016-07-19 02:43:29

标签: 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序列化程序什么可以导致循环引用,什么可以和必须序列化,什么不能序列化,对吧?

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

请勿尝试直接序列化您的域模型。创建一个视图模型,以您想要的确切格式返回数据。使用域模型填充视图模型。这里有更多信息Why do we use ViewModels?

答案 2 :(得分:0)

您需要有一个ViewModel,它将充当UI和后端数据结构之间的接口。 后端数据结构被设计为易于存储和在数据库中检索。因此,通过编写一些ViewModel“适配器”,您就不会违反“不要重复自己”的规则。

希望有帮助。

答案 3 :(得分:0)

我今天必须解决同样的问题。对我来说,最简单明了的方法是从实体模型上的实体之一中删除 Navigation 属性。 打开您的 model.edmx 并删除导致循环引用的不需要的 Navigation 属性。你的情况

书籍参考作者。所以书实体模型有作者导航属性。

如果您不希望 Author 引用 Book,只需从 edmx 文件的 Author 数据模型中删除 Book 导航属性。所以,只有一种引用方式。