EF6:如何避免循环引用
本文关键字:循环 引用 何避免 EF6 | 更新日期: 2023-09-27 17:57:29
在使用ASP.NET Web API进行JSON序列化期间,有哪些可能避免使用Entity Framework 6进行循环引用?
我为实体框架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文件或实体框架中,以告诉JSON序列化程序什么可以引起循环引用,什么可以和必须序列化,什么不能序列化,对吧?
直接序列化域模型在技术上没有问题。为了避免循环引用,您不能使用延迟加载。你必须控制装载。为此,
- 在模型的每个集合之前删除虚拟(采用代码优先的方法)
- 将延迟加载配置设置为false(在数据库优先方法中)
不要试图直接序列化您的域模型。创建一个视图模型,以所需的确切格式返回数据。使用域模型填充视图模型。这里有更多信息为什么我们使用ViewModels?
您需要一个ViewModel,它将充当UI和后端数据结构之间的接口。后端数据结构设计为易于存储和从数据库检索。因此,通过编写一些ViewModel"适配器",您并没有违反"不要重复自己"的规则。
希望能有所帮助。
我今天不得不解决同样的问题。对我来说,最简单明了的方法是从实体模型上的一个实体中删除Navigation属性。打开model.edmx并删除导致循环引用的不需要的Navigation属性。在您的情况下
图书参考资料作者。所以图书实体模型具有Author导航特性。
如果您不希望Author引用Book,只需从edmx文件的Author数据模型中删除Book导航属性即可。因此,只有一种引用方式。