序列化类System.Data.Entity.DynamicProxies.Photos

因为这个表和另一个表是有一对多关系的,当序列化表1的时候,会找到和另一个表2关联的字段,就会到另一个表2中序列化,然后另一个表2中也有一个字段和表1相关联.这样.序列化就会发生这种错误! 相关解决方案有3种:
1.最简单的方式就是从Entity Framework着手,停用LazyLoading与ProxyCreation.因为LazyLoading停用后那么当JSON.Net解析Order对象时其属性Order_Details会返回null(不会自动加载).所以也就避免了此问题
当然此方式的缺点会导致后续程序存取Entity Object时牺牲了LazyLoading的方便性,需要手动处理此问题.
 
1.db.Configuration.LazyLoadingEnabled = false; 2.db.Configuration.ProxyCreationEnabled = false; 3.return db.Orders.AsEnumerable();
 
2.设定JSON.Net忽略循环参考
透过APP_Start的WebApiConfig.cs,设定config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
使用这个方式时要注意,它只是忽略循环参考的错误,但实际上还是会自动一层层解析要输出的对象之属性,所以若数据会相依有可能会产生无穷循环.
 
3.设定JSON.Net避免循环参考
透过APP_Start的WebApiConfig.cs,设定
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize;
config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
这种做法与2的差异在于它会将重复过的对象用一个代表取代,譬如底下JSON格式
1: [{“KaTeX parse error: Expected '}', got 'EOF' at end of input: …","Category":{"id”:“2”,“Products”:[{“KaTeX parse error: Expected '}', got 'EOF' at end of input: …","Category":{"ref”:“2”},“Id”:2,“Name”:“Yogurt”},{“KaTeX parse error: Expected 'EOF', got '}' at position 9: ref":"1"}̲],"Id":1,"Name"…ref”:“3”}]
所以对于数据而言这种作法还是会自动一层层解析要输出的对象之属性,只是避免输出太大量数据.
 
4.手动设定避免循环参考
如同3的模式,透过[JsonIgnore] 与[JsonObject(IsReference = true)] 细部设定,可以更精确的设定每个要输出的属性.
缺点是1.设定繁杂. 2.只能通用设定无法例外. 3.因为必须直接或透过 partial class方式设定,故无法将设定与Entity Object class做分离
 
以上作法实际上都有其优缺点, 并没有一个可以通用的模式, 须看需求而定,这问题与同早期RIA Service的问题相同,但这边提供一种比较通用的模式就是采用方法1+方法2或3.
停用LazyLoading,而使用程序的方式(透过 Include方法)决定那些属性要输出.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值