NHIbernate为一款优秀的ORM框架,它为我们开发基于关系型数据库的系统提供的相当的便利性。网上关于它的介绍有很多(如http://www.cnblogs.com/lyj/archive/2008/10/30/1323099.html),我这里就不在多说了。下面介绍我在用NHibernate中遇到的一些配置上的问题。
我使用的NHibernate版本是NHibernate-2.1.2.GA-bin。以前的版本没有用过,我觉得不同的版本下,NHibernate的配置是不一样的。也许有人说版本都不一样配置当然应该有区别了。但是我这里想说的是不仅仅是配置文件上的区别,各个版本下的NHibernate需要的其他一些程序集文件也是不一样的(让大侠见笑了,这个我以前真不知道,以为NHibernate版本升级更换一下新的NHibernate.dll就行了。)
下面我做的事情就是要将在NHibernate2.0.1.4000版本下能正常运行的程序换成2.1.2.4000遇到的一些问题。
环境:VS2008 SP1, SQLSERVER EXPRESS2005
NHibernate版本:NHibernate-2.1.2.GA
系统结构如下:
首先我将BLL下的NHibernate文件更换了。出现的第一个异常如下:
但是我查看了程序的Bin目录,发现是有Iesi.Collections.dll文件的。再说在2.0.1.4000运行不是能正常运行吗。?
我查看了一下Iesi.Collections.dll的版本,发现时程序集的版本确实是不一样。那么难道是NHibernate版本不同,他需要的其他程序集的版本也不一样吗。带着这个疑问,我用中间语言反汇编工具(在vs2008的命令提示窗口中输入ildasm即可以打开工具)看了一下两个版本下的NHibernate.dll,发现问题了。2.0.1.4000在IL DASM中显示元数据信息为如下图:
而2.1.2.4000中的元数据信息如下:
从上面两个图中可以清楚的看出:在这两个版本中所需要的Iesi中需要的版本是不一样的。也就是说如果你在2.1.2.4000中使用另外的一个Iesi版本,程序在加载2.1.2.4000的NHIbernate.dll时候,由于所需的其他程序集的版本必须要一直,否则,程序在运行时候就会抛异常。
在发现上面的问题后,我把NHibernate需要的其他动态库文件(如Iesi.Collections.dll文件)添加到bin目录中。
我替换的时候,在我的NHibernate配置文件hibernate.cfg.xml文件中都配置成”nhibernate-configuration-2.2“,这个不需要变化。(我有点不解,不同的版本下这个配置一样也行。我觉得似乎一个应该是2.1一个应该是2.2,出现问题时,我以为是这个问题,结果发现不是这个造成的)。
替换后程序运在运行中打开每个会话的时(ISession session = cfg.BuildSessionFactory().OpenSession();)
程序依然报如下异常:
由上述异常信息可以得知是因为没有配置造成的,所以应该在NHibernate.cfg.xml中添加对他的配置(2.0.1.4000中不需要对他进行配置)。配置如下:
<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>。
添加完配置后,运行程序依然抛异常,如下图:
根据异常的提示,我认为是缺少NHibernate.ByteCode.Castle.dll而导致程序加载出错,于是我将NHibernate.ByteCode.Castle.dll添加到Bin目录。继续编译后继续运行程序,继续抛异常,如下图:
由于这个程序集和Castle有关,由此我不得不怀疑相关的Castle的相关的程序集也应该需要。添加进来以后。继续运行程序,发现在使用HQL时候(IList<UserInfo> list = session.CreateQuery(" from UserInfo")),程序还是抛异常。如下图:
于是,我又添加Antlr3.Runtime.dll文件【当然得是上面异常中出现的版本】后,程序正常运行。
总结:NHibernate-2.1.2.GA版本下,做ORM开发,需要的动态库如下(以Castle而言):
1、NHibernate.dll 2、Antlr3.Runtime.dll 3、Castle.Core.dll 4、Castle.DynamicProxy2.dll 5、Iesi.Collections.dll 6、NHibernate.ByteCode.Castle.dll
7、log4net.dll
NHibernate-3.0.0下配置依然需要上述7个库文件,只是版本不一样罢了。
当然,如果使用的不是Castle,3、4就应该是相应的动态库了!
后记:NHibernate发展到今天【已经推出3.0版本】,依然有许许多多的追随者,我想应该是有很多原因的。即是今天MS同样推出了ORM技术LINQ、Entity FrameWork等等。我泛泛使用后觉得,Nhibernate的使用还是比他们都麻烦点,主要是配置方面。
好了,就絮叨到这。希望对初学NHibernate的朋友有所帮助。