原文地址: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的更多相关文章

  1. [译]ABP框架使用AngularJs,ASP.NET MVC,Web API和EntityFramework构建N层架构的SPA应用程序

    本文转自:http://www.skcode.cn/archives/281 本文演示ABP框架如何使用AngularJs,ASP.NET MVC,Web API 和EntityFramework构建 ...

  2. ABP 教程文档 1-1 手把手引进门之 AngularJs, ASP.NET MVC, Web API 和 EntityFramework(官方教程翻译版 版本3.2.5)含学习资料

    本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 转载请注明出处:http://www.cnblogs.com/yabu007/  谢谢 官方文档分四部分 一. 教程文档 二.ABP 框架 三. ...

  3. Asp.net mvc web api 在项目中的实际应用

    Asp.net mvc web api 在项目中的实际应用 前言:以下只是记录本人在项目中的应用,而web api在数据传输方面有多种实现方式,具体可根据实际情况而定! 1:数据传输前的加密,以下用到 ...

  4. ASP.NET MVC Web API 学习笔记---第一个Web API程序

    http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...

  5. ASP.NET MVC Web API Post FromBody(Web API 如何正确 Post)

    问题场景: ASP.NET MVC Web API 定义 Post 方法,HttpClient 使用 JsonConvert.SerializeObject 传参进行调用,比如 Web Api 中定义 ...

  6. ASP.NET MVC Web API For APP

    近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过在浏览器中使用 JavaScr ...

  7. 【转载】ASP.NET MVC Web API 学习笔记---联系人增删改查

    本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系 ...

  8. 实战 ASP.NET MVC Web API

    实战 ASP.NET MVC Web API Web API 框架基于 ASP.NET MVC 框架开发,是一个面向 Http 协议的通信框架.相对于 WCF 而言,Web API 只面向于 Http ...

  9. ASP.NET MVC Web API 学习笔记---联系人增删改查

    本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查. 目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的. 下面我们通过创建一个简单的Web API来管理 ...

随机推荐

  1. 我是一块cpu 《转载》

    我是一块cpu,原装intel,在一台普通的台式计算机里供职.我有个小弟是内存,我要靠他时时刻刻陪伴我工作,其实有时候我并不是没有某某地址的资料,而是懒得翻--麻烦. 还有一个老大哥叫bios,每次那 ...

  2. svn设置

    svnserver -d -r /home/peter.mycode 如果想要开机自启动,将上述启动命令添加到:/etc/rc.local中.

  3. java 生成pdf报表

    public void saveMapAddressInfo(String orderCode){ try{ List<Leads> leadses = leadsService.find ...

  4. org.springframework.beans.factory.BeanCreationException: 求教育!

    2014-11-26 14:05:56 [org.springframework.web.context.support.XmlWebApplicationContext]-[WARN] Except ...

  5. sql 作业+游标 自动备份数据库

    前言 昨天有个同事在客户的服务器上面弄数据库,不小心执行了一条 sql 语句 TRUNCATE TABLE xxx 碉堡了吧,数据全没了  - - ,然后就是在网上拼命的搜索关于数据恢复的软件,搞了一 ...

  6. iOS定位问题解决方案

    在需要用到定位服务时,需在info文件中加入: 1.NSLocationWhenInUseUsageDescription(类型为:string,值为:”我们需要通过您的地理位置信息获取您周边的相关数 ...

  7. java基础学习总结01

    在过去的一周我们先学习了JAVA的一些基础知识和基础语法,基础知识包括:指令.程序.计算机语言.机器语言.高级语言的概念和特点,java的概念.平台.组建等,以及代码的编译过程,代码的开发流程.基础语 ...

  8. java dos下中文乱码

    代码如下: public class PrintString{ public static void main(String args[]){ System.out.println("\\* ...

  9. JS 返回上一步(退回上一步上一个网页)

    链接式: <a href="JavaScript:history.go(-1)">返回上一步</a> <a href="<%=Requ ...

  10. webkit report

    %for main_o in objects: <% print main_o.sale_announcement_ids %> %for o in announcement_pool.b ...