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的朋友有所協助。