Nhibernate连接oracle数据库报 Could not compile the mapping document异常的解决方法
这个问题断断续续困扰了我一段时间,在网上搜遍了,没搜到谁真正说解决了这个问题。项目里用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的文件放进来,但具体这个是什么用,我还没有仔细研究,希望有人能整理出不同版本的配置文件的小差别和一些新增节点的含义。
配置文件最后为:

<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文件就能解析代码片段,麻烦说下哦。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述