前言:
这个问题我也是第一次遇到,刚开始的时候也是很懵,出来一堆不知道啥意思的错误,后来通过百度才知道,原来是自引用循环。我的代码里的错误意思就是自引用循环检测属性'funnyimginfo'与类型'System。知道这个错误我就感觉我知道从哪个方面入手了。感觉是导航属性的问题。一测试果然还真是。下面给大家分析下原因。
错误原因:
我的funnyimginfo实体和另两个实体的有主外键关联,然而在我对查询信息进行Json序列化的时候,就报错了。原因就是在进行Json进行转换的时候,把模型间的导航属性也算进去了。(实体之间主外键关联的较多,对象之间互相深度循环,导致Json序列化失败)。
解决办法:
网上说的解决办法有几种,但是我试试了都没实现。下面我给大家先介绍下我自己的解决办法。
先说下思路:
就是自己写一个类,类里的字段的值都是你需要返回给客户端的数据,然后用一个集合保存你从数据库拿到数据,然后创建一个Funny对象,把你需要的数据赋值给Funny类,最后在进行Json序列化。这样就不会因为导航属性出现这个错误了。
展示截图:
以上就是我的方法。
下面给大家介绍下网上的,不过我都没实现。不过大家如果用我的方法行不通时,大家可以试试网上的。
第一种:把实体之间的关联去掉(这种不建议采用,实体之间本来就是有关系的,不关联我们怎样操作呢,虽然也有方法,但是 麻烦。)
第二种:全局删除循环引用 webapiconfig中修改如下(这个我试了,没实现效果)
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
第三种:在导航属性上加注解[JsonIgnore]忽略此属性 EF采用database first的话可能不适用。
这个问题到此结束。嘿嘿!
结尾:
分享:任何的限制,都是从自己的内心开始的。忘掉失败,不过要牢记失败中的教训!