在使用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. MYSQL添加外键关联

    SELECT * from stu st,course co,score sc where st.sid = sc.sid and sc.cid = co.cid 如果我们要给 sid 做一个约束,即 ...

  2. MVC5 模型 生成EF

    在看本篇之前请先去了解一下EF以及如何利用模型生成数据库  https://i.cnblogs.com/posts?categoryid=1107227 看Code First就可以了. 等你了解了E ...

  3. webpack——概念的引入

    ## 在网页中会引用哪些常见的静态资源?+ JS - .js .jsx .coffee .ts(TypeScript 类 C# 语言)+ CSS - .css .less .sass .scss+ I ...

  4. jQuery编程代码规范的最佳实践

      好像是feedly订阅里看到的文章,读完后觉得非常不错,译之备用,多看受益. 加载jQuery 1.坚持使用CDN来加载jQuery,这种别人服务器免费帮你托管文件的便宜干嘛不占呢.点击查看使用C ...

  5. 序列(Sequence)创建、使用、修改和删除

    序列(Sequence)是用来生成连续的整数数据的对象.序列常常用来作为主键中增长列,序列中的可以升序生成,也可以降序生成. 语法结构:创建序列 CREATE SEQUENCE sequence_na ...

  6. redis 高性能应用

    redis可达到512M/per key 512M=512*1024KB=512*1024*1000B=512*1024*1000*8bit=40亿+ 化整为零40亿,也就是说一位代表一个用户,40亿 ...

  7. 使用Vscode写python

    在python官网下载好python2.x 或者 3.x, 然后在vscode 下载python插件. 写一个python程序, 运行, vscode会自动提示你配置python执行路径,并帮你创建好 ...

  8. 最大的最大公约数( 51nod-1179)

    妈耶有日期显示啊,我还写什么... 给出N个正整数,找出N个数两两之间最大公约数的最大值. 例如:N = 4,4个数为:9 15 25 16,两两之间最大公约数的最大值是15同25的最大公约数5.   ...

  9. linux系统基础之---RPM管理(基于centos7.4)

  10. 利用nginx使ftp可以通过http访问

    ./nginx 启动服务./nginx -s stop 关闭服务./nginx -s reload 重新加载配置文件 搭建nginx映射ftp服务:打开nginx的配置文件nginx.conf(位于n ...