NHibernate配置問題總結
NHIbernate為一款優秀的ORM框架,它為我們開發基于關系型數據庫的系統提供的相當的便利性。網上關于它的介紹有很多(如http://www.rzrgm.cn/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的朋友有所幫助。
浙公網安備 33010602011771號