关注开源代码的实际应用
NHibernate中使用 ISession.Load 加载的只是未经初始化的 Proxy,而 ISession.Get 加载的对象是初始化的。
所以,如果取完数据就关闭Session需要使用ISession.Get以避免使用Lazy-load的对象属性为null。
用过NHibernte的人都知道需要在每个实体类的public属性前加上virtual关键字,才可以使用NHibernate的延迟加载(Lazy-loading)的功能。大多数情况下,没有谁对这种开发方式有意见,但是在我看来这是一种丑陋的开发方式,并且有时会漏写virtual关键字需要在程序进行时才能通过抛出的异常知道问题所在。这里通过AOP框架Postsharp解决此问题。
1、Postsharp程序集或代码可从http://www.postsharp.org/网站下载。下载“Unsealer”并将“Unsealer.Weaver.dll”与“Unsealer.psplugin”相关文件复制到Postsharp安装目录下Plugins文件夹下。在NHibernate实体类所在项目中引用PostSharp.Public.dll和Unsealer.dll。
2、两种方式任选一种:①在每个实体类前加上[Unseal]特性;②在AssemblyInfo.cs文件中加上[assembly: Unseal(AttributeTargetTypes = "*")]。
这样就无需再为NHibernate实体类属性加上virtual了。
注:通过此种方式定义实体类时,任何实体类不可定义为sealed类型。
NHibernate 2.0 中并不包含Linq to NHibernate,但NHibernate 2.1将支持Linq。