ASP.Net MVC-Web API使用Entity Framework时遇到Loop Reference
原文地址:http://www.it165.net/pro/html/201210/3932.html
最近开始研究Web API,运气不错第一个测试项目就遇到问题@@-当新增Control时选择[API Controller woth read/write actions, using Entity Framework]然后使用Northwnd数据库,数据表选择Orders,Order_Details,Products.


前端javascript程序代码如下
01.@section scripts{ 02.<script type="text/javascript"> 03.$(document).ready(function () { 04. 05.$.getJSON('/api/order/', function (data) { 06.alert(data); 07.}) 08..error(function (jqXHR, textStatus, err) { 09.alert('Error: ' + err); 10.}); 11.}); 12.</script> 13.}执行后出现错误,查询完整的错误说明为Self referencing loop detected…,也就是循环参考.

这错误讯息好熟悉,突然想起以前开发Silverlight RIA Service好像也有类似情况.经上网查询原因后果不其然,问题是一样的,因为ASP.Net
MVC Web
API预设采用JSON.Net作为输出转换,而预设的情况下JSON.Net会自动一层层解析要输出的对象之属性,也就说这个例子中的输出对象为
Order,其中有个属性为Order_Details,而Order_Details也有个属性参考至Order,所以产生了循环相依问题,导致错误产
生.
这个问题处理方式有三种 www.it165.net
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. 4.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:
[{"$id":"1","Category":{"$id":"2","Products":[{"$id":"3","Category":{"$ref":"2"},"Id":2,"Name":"Yogurt"},{"$ref":"1"}],"Id":1,"Name":"Diary"},"Id":1,"Name":"Whole
Milk"},{"$ref":"3"}]
所以对于数据而言这种作法还是会自动一层层解析要输出的对象之属性,只是避免输出太大量数据.
4.手动设定避免循环参考
如同3的模式,透过[JsonIgnore] 与[JsonObject(IsReference = true)] 细部设定,可以更精确的设定每个要输出的属性.
缺点是1.设定繁杂. 2.只能通用设定无法例外. 3.因为必须直接或透过 partial class方式设定,故无法将设定与Entity Object class做分离
以上作法实际上都有其优缺点, 并没有一个可以通用的模式, 须看需求而定,这问题与同早期RIA Service的问题相同,但这边提供一种比较通用的模式就是采用方法1+方法2或3.
停用LazyLoading,而使用程序的方式(透过 Include方法)决定那些属性要输出.
ASP.Net MVC-Web API使用Entity Framework时遇到Loop Reference的更多相关文章
- [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序
本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...
- ABP 教程文档 1-1 手把手引进门之 AngularJs, ASP.NET MVC, Web API 和 EntityFramework(官方教程翻译版 版本3.2.5)含学习资料
本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 转载请注明出处:http://www.cnblogs.com/yabu007/ 谢谢 官方文档分四部分 一. 教程文档 二.ABP 框架 三. ...
- Asp.net mvc web api 在项目中的实际应用
Asp.net mvc web api 在项目中的实际应用 前言:以下只是记录本人在项目中的应用,而web api在数据传输方面有多种实现方式,具体可根据实际情况而定! 1:数据传输前的加密,以下用到 ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
- ASP.NET MVC Web API Post FromBody(Web API 如何正确 Post)
问题场景: ASP.NET MVC Web API 定义 Post 方法,HttpClient 使用 JsonConvert.SerializeObject 传参进行调用,比如 Web Api 中定义 ...
- ASP.NET MVC Web API For APP
近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScr ...
- 【转载】ASP.NET MVC Web API 学习笔记---联系人增删改查
本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系 ...
- 实战 ASP.NET MVC Web API
实战 ASP.NET MVC Web API Web API 框架基于 ASP.NET MVC 框架开发,是一个面向 Http 协议的通信框架.相对于 WCF 而言,Web API 只面向于 Http ...
- ASP.NET MVC Web API 学习笔记---联系人增删改查
本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查. 目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的. 下面我们通过创建一个简单的Web API来管理 ...
随机推荐
- 使用了hibernate时候乱码问题
在配置文件的url地址最后加上characterEncoding=utf-8
- WisDom.Net 框架设计(三) 数据缓存
WisDom.Net --数据缓存 1.几种缓存方式 1.静态全局变量 C#静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问不带有 static 修饰符声明 ...
- 【转】IOS AutoLayout详解(三)用代码实现(附Demo下载)
转载自:blog.csdn.net/hello_hwc IOS SDK详解 前言: 在开发的过程中,有时候创建View没办法通过Storyboard来进行,又需要AutoLayout,这时候用代码创建 ...
- iOS 里面如何使用第三方应用程序打开自己的文件,调用wps其他应用打开当前应用里面的的ppt doc xls
我们的自己的应用里面经常涉及的要打开ppt doc,这样的功能,以前总以为iOS沙盒封闭化,不可能实现,后来终于解决了 使用 UIDocumentInteractionController 来解决这一 ...
- iOS 相机手动对焦
AVCaptureDevice的方法,之前查了网上和stackoverflow上,没有,于是自己试着做了下,成功了,分享下. //实例化 AVCaptureDevice *captureDevice ...
- [转载]python os.path模块
os.path模块主要用于文件的属性获取,在编程中经常用到,以下是该模块的几种常用方法.更多的方法可以去查看官方文档:http://docs.python.org/library/os.path.ht ...
- 【随记】VS异常:HRESULT: 0x80070057 (E_INVALIDARG)) 解决方案
今天公司突然断电后,来电重启VS,调试WebService时报错: 未能加载文件或程序集 “XXX” 或它的某一个依赖项.系统找不到指定的文件. 说明: 执行当前 Web 请求期间,出现未处理的异常 ...
- A Good Beginning Helps To Make A Good End
Hello Guys, It seems nothing would be not good after posting this blog link in my MS application. Se ...
- cloudera-scm-server ip改了怎么办了
1.vi /etc/cloudera-scm-agent/config.ini #改下ip 2.manager 老只看到一个主机 rm -f /var/lib/cloudera-scm-agent/u ...
- Python的subprocess模块
尝试在Python中运行可执行文件,网上给出的解决方案是: import os os.system("此处填程序路径") 我要运行的程序文件名中有空格,因此果断失败了,查看了一下帮 ...