在使用Entity Framework时,如果数据库中有两个表是一对多或者是多对多的关系,那么生成的实体类中就有一个导航属性。这个导航属性前面都加上了一个virtual关键字。这个virtual关键字代表这个属性的值在运行时,是延迟加载的。我们可以在Context里面关闭掉这个延迟加载的特性。

         如果一个实体类有这个导航属性,并且有virtual关键字。不管你是不是启用了延迟加载,在进行序列化的时候,都会为这个延迟属性所在的类生成一个代理类,这个代理类是真正实体类的子类。这个代理类里面有对这个类本身的自引用,所以在序列化的时候,就会陷入死循环。在前台转换成Json的数据的时候,是需要序列化的,在这个时候,就会报错,显示序列化不了。

         这时候有两种解决的办法,一种是在有这个导航属性的类上面加上一个特性。

[DataContract(IsReference = true)] 

          另外一种办法就是在实体化DataContractSerializer对象时,调用它的另外一个构造函数:

DataContractSerializer serializer = new DataContractSerializer(typeof(T), typeof(T).Name, string.Empty, null, int.MaxValue, false, true, null, null);

          不过这种方法好像只能解决序列化成xml,序列化成json的还会有问题。DataContractJsonSerializer没有类似选项。

          最后,我实际在项目中用的方法是定义DTO对象。因为我们之所以要序列化这个导航属性,是前台要用。但是前台用并不是用到这个导航属性(一般是一个对象list)的所有字段,可能只用到里面的部分字段。这时候,我们最好能定义DTO(数据传输对象),DTO对象就是定义前台界面需要用到的所有字段,前台界面只跟DTO打交道,在后台通过方法把真正的实体对象拼接成DTO对象。这样就不需要对包含导航属性的实体类进行序列化了,而是对DTO对象序列化。DTO里面不包含导航属性,就不会出现这个序列化的问题。

          参考:

          http://bbs.csdn.net/topics/390180865

          http://www.360doc.com/content/12/0612/16/466494_217702770.shtml

使用Entity Framework时,序列化出错的更多相关文章

  1. ASP.Net MVC-Web API使用Entity Framework时遇到Loop Reference

    原文地址:http://www.it165.net/pro/html/201210/3932.html 最近开始研究Web API,运气不错第一个测试项目就遇到问题@@-当新增Control时选择[A ...

  2. 使用Entity Framework时遇到的问题

    1.运行程序时提示 ,vension does not match. 差不多是这样一个提示,具体怎么样的给忘记了. #1remove 'entity framework' from reference ...

  3. 使用Entity Framework时遇到的各种问题总结

    在这里记录一下之前使用Entity Framework(4.3.1版本)遇到的问题. 更新没有设置主键的表 在默认情况下,EF不能对一个没有主键的表进行更新.插入和删除的动作.用xml方式查看edmx ...

  4. 关于使用Entity Framework时遇到的问题 未找到具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。请确保在应用程序配置文件的“entityFramework”节中注册了该提供程序

    问题描述: 使用Entity Framework获取数据时报以下错误: 未找到具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序.请确保在应用程序 ...

  5. Entity Framework 6 编译出错的问题(VS2012)

    更新:其实这个问题是由于VS2012的EF代码生成模板是EF 5.x的,自然会与EF6 的runtime不兼容.起初我按照更新前的方式解决了,后来却发现会出现不止这一处命名空间发生改动而导致的问题. ...

  6. 使用Entity Framework时要注意的一些性能问题

    http://diaosbook.com/Post/2012/12/9/performance-issue-in-select-one-or-few-colums-via-entityframewor ...

  7. 【藏】使用Entity Framework时要注意的一些性能问题

    这篇文章写的很好: http://diaosbook.com/Post/2012/12/9/performance-issue-in-select-one-or-few-colums-via-enti ...

  8. AppBox升级进行时 - 关联表查询与更新(Entity Framework)

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. 关联表的查询操作 使用 Include 方法,我们可以在一次数据库查询中将关联 ...

  9. Entity framework在用于WCF时创建数据模型的问题

    众所周知,WCF的传输对象,在创建时需要在类名上标识[DataContract]以及在属性上标识[DataMember],当我们在使用Entity framework时(不考虑Code first的情 ...

随机推荐

  1. 每天一个linux命令:df 命令

    linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式: df [选项] [文件] 2.命 ...

  2. Fy's dota2 题解

    题目描述 Fy 觉得自己玩 cf,lol 这种高端游戏已经够厉害了,于 是他决定去玩 dota2.结果 fy 的鼠标右键坏了,所以他就等 到 2250 买了把闪烁匕首,用跳刀前进,准备去送泉水.但 是 ...

  3. Yii2获取当前程序执行的sql语句

    1.Yii2获取当前程序执行的sql语句: $query = model::find();         $dataProvider = new ActiveDataProvider([       ...

  4. set 和select 的区别

    简单赋值是没有区别的

  5. HTML5之表单新增类型介绍

    1.html5的input标签的type类型新增介绍: 2.表单新增属性介绍: 3.代码示例: <!doctype html> <html> <head></ ...

  6. yarn下资源配置

    http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.0.6.0/bk_installing_manually_book/content/rpm-ch ...

  7. 1..net转java背景介绍

    注册博客2年了.从注册就开始接触.net.以前也有想过转java.只是没想过会这么快. .net语法这么优美好用.可惜了生态环境. .net还没有学成大神.就要离开了. 公司有个项目要用java.在加 ...

  8. data-ng-hide 指令

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  9. html 固定长度 超出长度 显示省略号

    a{         width: 80px;/* 要显示文字的宽度 */         float: left;/* 左对齐,不设置的话只在IE下好用 */         overflow: h ...

  10. Oracle树形结构数据---常见处理情景

    Oracle树形结构数据---常见处理情景 1.查看表数据结构 SELECT *      FROM QIANCODE.TREE_HIS_TABLE T  ORDER BY T.NODE_LEVEL; ...