今天有如鹏的学生遇到一个问题:把一个对象保存到Session中(进程外Session)后,Web服务器重启,当从Session读取这个对象的时候报错,提示是一个“T_Users”后面跟着一大串数字的类型,不是“T_Users”类型。

凭着感觉,我问“这个对象是普通对象还是什么对象”,回复说“是Entity Framework返回的对象”,瞬间我知道了:是延迟加载造成的。
下面写个程序验证一下。

数据库里建立两张表:一张T_Persons表,一张T_Dogs表,T_Dogs表中有一个MasterId字段是指向T_Persons的外键,表示“狗的主人是谁”。
    然后创建数据库的Entity。然后编写下面的代码:

abcEntities e = new abcEntities();
T_Persons p = e.T_Dogs.First().T_Persons;
Type t = p.GetType();
Console.WriteLine("对象类型:"+t);

  

第二行代码的意思很显然是:获得T_Dogs中第一个对象的主人对象,然后第三行获得的是对象的类型,我们惊奇的发现打印结果是:System.Data.Entity.DynamicProxies.T_Persons_A2C5F62323A22039FDCBEB40BD……

很奇怪,不应该是T_Persons类的对象吗,怎么是这么一个怪玩意。

这就涉及到“延迟加载(LazyLoading)”的原理了。对于需要延迟加载的对象,EF会动态生成一个实体类型的子类,这个子类是一个“动态代理(DynamicProxy)”类,这个类会进行延迟加载的处理。所以我们拿到的对象不直接是T_Persons类的对象,而是“动态代理(DynamicProxy)”类的子类,当然由于这个类是T_Persons的子类,所以“T_Persons p = e.T_Dogs.First().T_Persons”这样用父类的变量指向它也是可以的。多态经常偷偷帮我们做很多奇妙的事情。

由于这个对象是动态产生的类的对象,当程序重启之后,产生的“动态代理(DynamicProxy)”类和之前的“动态代理(DynamicProxy)”类就是两个类了。所以就会反序列化失败了。

很多ORM框架中延迟加载都是使用动态代理来实现的,比如Java中的Hibernate或者.Net的移植版NHibernate。

如鹏网.Net培训班正在报名,有网络的地方就可以参加如鹏网的学习,学完就能高薪就业,点击此处了解

三年前只要懂“三层架构”就可以说“精通分层架构”;现在则需要懂IOC(AutoFac等)、CodeFirst、lambda、DTO等才值钱;

三年前只要会SQLServer就可以说自己“精通数据库开发”;现在则需还需要掌握MySQL等开源数据库才能说是“.Net开源”时代的程序员;

三年前只要会进行用户上传内容的安全性处理即可;现在则需要熟悉云存储、CDN等才能在云计算时代游刃有余;

三年前只要掌握Lucene.Net就会说自己“熟悉站内搜索引擎开发”;现在大家都用ElasticSearch了,你还用Lucene.Net就太老土了;

三年前发邮件还是用SmtpClient;现在做大型网站发邮件必须用云邮件引擎;

三年前缓存就是Context.Cache;现在则是Redis、Memcached的天下;

如鹏网再次引领.Net社区技术潮流!点击此处了解如鹏网.Net最新课程

最新文章

  1. MAC破解软件
  2. 调用newtonsoft.json反序列出错
  3. struts action和jsp之间的传值
  4. ios html5 网页取消默认样式
  5. 在Linux下安装PHP过程中,编译时出现错误的解决办法
  6. 编译gcc4.7.3 其他版本的应该也可以
  7. Linux基础 30分钟GDB调试快速突破
  8. IOS底层数据结构--class
  9. hdu 5025 Saving Tang Monk 状态压缩dp+广搜
  10. HDU5047Sawtooth(java大数)
  11. javascript基础学习(八)
  12. using namespace cocos2d;
  13. Qt通过Http上传文件(路过)
  14. protobuf使用NDK编译Android的静态库(工作记录)
  15. MongoDB 分片集群技术
  16. VS2017用正则表达式替换多行代码
  17. Spring Boot 异常处理
  18. MySql与python交互
  19. canny 算子python实现
  20. 根据txt中的文件名将文件复制到目标文件夹中

热门文章

  1. ng animate
  2. Merge Intervals 运行比较快
  3. 金蝶 K/3 Cloud 服务端控件编程模型
  4. Oracle DBA常用查询
  5. 海量数据相似度计算之simhash短文本查找
  6. HttpWebRequest向路由器提交基本身份验证
  7. mysql的数据转换
  8. zend studio常用快捷键
  9. 如何让openvpn在windows启动时自动加载
  10. CAD二次开发 - 可缩放块(四)