這個問題斷斷續續困擾了我一段時間,在網上搜遍了,沒搜到誰真正說解決了這個問題。項目裡用spring.net封裝的Nhibernate操作oracle資料庫一直沒出現類試問題,但這次用純Nhibernate連oracle老是報錯,最後解決了才發現是NHibernate版本問題引起的(這個報錯確實很迷惑人,感覺像hbm.xml引起的問題)。用純的NHibernate,當時為了快點測試自己想做的程式,就下了別人的DEMO直接用,雖然現在好像出3.0版本了,DEMO是2.0.0.4000版本的,我項目裡用spring.net封裝的nhibernate是2.1.0.4000版本的,一直用的很好,找啊搜啊,弄了很久,終於發現原來是 設定檔中<property name="dialect">NHibernate.Dialect.Oracle9iDialect</property>這個地方出的問題,因為我本地的dialect就是這個,最好才發現2.0版本應該是<property name="dialect">NHibernate.Dialect.Oracle9Dialect</property>,沒有這個i,然後一切都正常了。。。。這個還是我直接反編譯看兩個不同版本nhibernate比較出來的,錯誤原因改起來很快,找起來花了不少時間和彎路。
現在大概看了下,發現不同nhibernate版本配置起來都還有點小差異,版本換了,Iesi.Collections.dll檔案也得換,比如用2.1的,比2.0的配置至少要多<property name="proxyfactory.factory_class">的配置,而且如果用到了<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>,還要把NHibernate.ByteCode.Castle.dll和castle的檔案放進來,但具體這個是什麼用,我還沒有仔細研究,希望有人能整理出不同版本的設定檔的小差別和一些新增節點的含義。
設定檔最後為:
hibernate.cfg.xml
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test" >
<property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
<property name="connection.connection_string">Data Source=DEMO;User Id=MyU1;Password=lawson;Pooling=true; Min Pool Size=0; Max Pool Size=512;</property>
<!--<property name="adonet.batch_size">10</property>
<property name="show_sql">true</property>-->
<property name="dialect">NHibernate.Dialect.Oracle9Dialect</property><!--2.1的為NHibernate.Dialect.Oracle9iDialect-->
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<!--<property name="use_outer_join">true</property>
<property name="command_timeout">10</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>-->
<!--<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>--><!--2.1的需要這個-->
<mapping assembly="DomainModel"/>
</session-factory>
</hibernate-configuration>
這個問題現在看來好像不算什麼問題,對版本不熟悉,但真正遇到這種小問題的時候,網上又搜尋不到解決方案的時候,常常走彎路去想辦法解決,所以記錄一下吧。
今天本來沒想解決這個問題的,看了很久的razor解析引擎,想看下解析程式碼片段,發現封裝的好深啊,而且mvc3 rc原始碼裡都沒有他們的聲影,不知道是不是單獨的開源項目,我就只好反編譯看看了,這個確實是個全新的解析引擎,不是繼承PAGE這樣的解析方法,我以為像NVelocity一樣的解析,可以把程式碼片段拿到記憶體解析出來,比如網站做推薦位這些會用這個,動態解析資料庫裡的nvelocity代碼,但是反編譯看了下razor,發現他一樣的依賴於具體檔案,才能解析出來,就是必須有自己的cshtml頁面,才能解析出來,用reflector可以調試到一些封裝的dll,但是總有部分調式不進去,很煩,也許是分析的不夠深,如果有其他同學發現razor源碼,或者看到它可以不用cshtml檔案就能解析程式碼片段,麻煩說下哦。