1,延迟加载。

延迟加载,即用到的时候再加载数据。这种机制是非常有情怀的,比如一篇中的用户实体有标签、问题等导航属性,如果只是用到用户名去查询整个实体,则把相关的标签和问题也都加载,性能会比较低。而有了延迟加载机制之后就可以做到查询用户实体只加载用户数据,访问到标签或问题等属性的时候再去加载这些数据。

如果使用Linq To NHibernate,则可以使用Linq提供的延迟加载机制,对于这种,是linq提供的机制,就不讨论了。

需要注意的是,如果查询出用户实体之后,关闭了Session。则延迟加载的时候会抛出异常。这是因为关闭session数据库连接被关闭,无法继续查询数据。

NHibernate默认是开启延迟加载的,也可以通过Lazy="false"属性关闭某个属性的延迟加载机制,这时会立即加载。

可以通过查看生成的sql来验证这种情况,再此就不写示例代码了。

2,延迟加载的原理。

延迟加载一般是通过代理模式来实现的,NHibernate会为我们的实体生成一个继承与该实体的代理,并重写父类的方法(这也是NHibernate要求我们的实体属性都必须是Virtual的原因)。

比如对于我们的User类,会生类似如下的代理类:

public class UserProxy:User
{

public override List<Question> Questions

{

get

{

base.Questions = ...//加载数据

return base.Questions;

}

set

{

base.Questions = value;

}

}

}

因为继承的关系,所以把代理类赋值给User类是没有问题的,同时由于多态,调用User的Question的时候实际调用的是代理类的属性。

3,方法Get和Load的区别。

Session有两个查询数据的方法,及Get和Load。Get方法会立即从数据库加载对象,而Load方法返回的是一个代理对象,当使用这个代理对象时,再去查询数据库,从而实现延迟加载。

这一点也可以通过监视生成的sql来实现。

4,Linq To NHibernate中的立即查询。

有时候,我们明确知道在某个业务逻辑中会用到当前实体的某个导航属性,希望查询的时候一次查询出来提高效率,而不是先加载实体,再加载导航属性。这时候可以用Linq To NHibernate中的立即查询来实现。

NHibernate提供了四种方法:Fetch及ThenFetch,FetchMany及ThenFetchMany。

Fetch用来加载关联关系,加载User的同时加载导航属性Question集合:

var users = session.Query<User>().Fetch(u=>u.Questions).ToList();

如果Question实体又包含Answer的导航属性,希望也一并加载出来,则可以使用ThenFetch:

var users = session.Query<User>().FetchMany(u=>u.Questions).ThenFetch(q=>q.Answers).ToList();

对于Fetch和FetchMany的区别:

针对上面的代码Fetch返回的是Question集合,不能针对返回结果继续ThenFetch。

而FetchMany返回的是Question,可以对其结果继续进行ThenFetch。

使用NHibernate(8)-- 延迟加载的更多相关文章

  1. [NHibernate]延迟加载

    目录 写在前面 文档与系列文章 延迟加载 一个例子 总结 写在前面 上篇文章介绍了多对多关系的关联查询的sql,HQL,Criteria查询的三种方式.本篇文章将介绍nhibernate中的延迟加载方 ...

  2. NHibernate系列文章二十一:延迟加载

    摘要 NHibernate的延迟加载机制是很重要的内容.通过关系映射将数据库表之间的关系映射成对象之间的关系,如果没有延迟加载机制,从主表的一个对象的查询将直接查询出所有与该对象关联的其他对象,如果关 ...

  3. Nhibernate cookbook 3.0-翻译

    /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-ts ...

  4. NHibernate教程(13)--立即加载

    本节内容 引入 立即加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过上一篇的介绍,我们知道了NHibernate中默认的加载机制--延迟加载.其本质就是使用GoF23中代理模式 ...

  5. 在 NHibernate 中一切必须是 Virtual 的吗?

    原文地址:Must Everything Be Virtual With NHibernate? 老赵在博文中 我对NHibernate的感受(2):何必到处都virtual 提到这篇文章,顺便翻译一 ...

  6. NHibernate Linq查询 扩展增强 (第九篇)

    在上一篇的Linq to NHibernate的介绍当中,全部是namespace NHibernate命名空间中的IQueryOver<TRoot, TSubType>接口提供的.IQu ...

  7. (转)EntityFramework之领域驱动设计实践

    EntityFramework之领域驱动设计实践 - 前言 EntityFramework之领域驱动设计实践 (一):从DataTable到EntityObject EntityFramework之领 ...

  8. EntityFramework之领域驱动设计实践

    EntityFramework之领域驱动设计实践 - 前言 EntityFramework之领域驱动设计实践 (一):从DataTable到EntityObject EntityFramework之领 ...

  9. 01-05-01-1【Nhibernate (版本3.3.1.4000) 出入江湖】延迟加载及其class和集合(set、bag等)的Lazy属性配置组合对Get和Load方法的影响

    这篇文章 http://ayende.com/blog/3988/nhibernate-the-difference-between-get-load-and-querying-by-id One o ...

随机推荐

  1. Spring day01笔记

    struts:web层,比较简单(ValueStack值栈,拦截器) hibernate:dao层,知识点杂 spring:service层,重要,讲多少用多少 --> [了解]   sprin ...

  2. JAVA的包装类 【转】

    Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数 ...

  3. 自己开发基于c#的垂直滚动条控件

    由于Visual Studio工具箱中自带滚动条控件外观太老,而且没有颜色外观属性可设置. 所以自己就试着开发一个垂直的滚动条,它可以用来控制TextBox的滚动. 由于代码比较多,源文件已经打包到网 ...

  4. (转)javascript中的对象查找

    本文转自:http://otakustay.com/object-lookup-in-javascript/  ---很棒的一篇文章,作者的其他文章还暂时没读,但相信作者是一个谦虚 谨慎的好工程师 近 ...

  5. 移动端WEB开发,click,touch,tap事件浅析

    一.click 和 tap 比较 两者都会在点击时触发,但是在手机WEB端,click会有 200~300 ms,所以请用tap代替click作为点击事件. singleTap和doubleTap 分 ...

  6. win7,win8.1下hosts文件无法修改的快速解决办法

    一,找到C:\Windows\System32\drivers\etc,下hosts文件复制一份到桌面: 二,使用notepad++或其他编辑器修改桌面复制出来的那份HOSTS: 三,将修改后的文件复 ...

  7. APP都有哪些类型?

    Web App的优势:(线上应用) 1.开发成本低 2.适配多种移动设备成本低 3.跨平台和终端 4.迭代更新容易 5.无需安装成本 Web App的劣势: 1.浏览的体验短期内还无法超越原生应用 2 ...

  8. VC++ 动态创建单个工具条,并加载外部的位图(bmp)文件为工具栏图像

    步骤: 1, 在框架类CMainFrame头文件里,增加图像变量和工具条变量. CMFCToolBarImages m_UserImages; CMFCToolBar m_wndToolBar; 2, ...

  9. 博客的开端,找对象不再new

    今天是第一次用blog,小白开始完善了!! 希望大家多多照顾一下.

  10. 爬虫--scrapy--windows上安装

    关于scrapy的安装网上有一大把教程,但是比较麻烦,各种包----------,这里给大家介绍一款神器: 下载地址:http://continuum.io/downloads 根据自己电脑的系统选择 ...