说实话,我累了这一天有点冤,因为我压根没想到原因不在我身上
一开始,我打开NhibernateCOntrib项目,运行它的NullableTest下的Nhibernate测试,完全没有任何问题
看了一下它的例子,过程也很简单
引入Nullables程序集,引入Nullables.NHibernate程序集
然后,将变量类型改为Nullables下的各种Nullable类型
同时,修改MAPPING文件,将property的Type属性改为
Nullables.NHibernate.NullableInt32Type等等属性
这样,基本类型在插入数据库中时,就可以使用NULL值了
看了一下,比较简单
于是在自己的项目中就引入程序集,按步就班的做
但是,在加入NULLABLE类型时,却发现,单元测试不通过
提示"无法取得静态属性值.."之类的
三番五次检查无果

晚上回家后,不服气
于是,这次单独建一个测试项目,单独测nullable的使用状况
引入Nullables程序集和nullables.Nhibernate程序集
这次,编译时,却发现,提示"Nhibernate程序集,版本1.0.1... 未能复制到...目录,原因是将会覆盖掉Nhibernate程序集,版本1.0.2"
晕了,我下载的分明是Nhibernate 1.0.2,咋冒出来个1.0.1呢
由于问题是引入Nullalbes程序集引起的,看来是Nullables程序集依赖于Nhibernate 程序集
幸好 Nhibernate.Contrib有源码,于是,打开源代,发现果然,这个项目中nullables程序集还真是引用的Nhibernate 1.0.1
真是奇怪,看来就算源码控制的再好,也难免版本搞错,于是,更改contrib中所有项目的Nhibernate引用,让其引用 1.0.1
再次回到我的项目,删除对nullables的引用和Nullables.Nhibernate的引用,再重新引用编译后的Contrib项目中正确的nullables和nullables.Nhibernate,再次编译我的项目
这次 ,提示,"无法将nullables程序集,版本1.0.1复制到....目录"
晕死,咋又来个1.0.1呢,再次检查Contrib源码,发现,Nullables.Nhibernate项目引用的Nullables程序集竟然是1.0.1的
于是,再次修正
这一次,重新编译我的项目,然后ExportSchema,检查数据库,发现,关系表终于建好了!

虽然这次遇到的问题较为简单,无非是程序集版本问题,可是,这至少说明,第一,我们拿到开源项目时,最好自己先检查一次项目的版本有没有问题
第二,版本问题往往比较隐蔽,并且,当测试不通过时,生成的异常常常不着边际,甚至误导你向错误的方向检查
第三,这也说明,开源项目,像Nhibernate虽好,但是,其毕竟有一些潜在的BUG,要真正投入项目时,请务必三思

同时,Nhibernate.Contrib项目,我发现,这个项目做的非常不完整,许多地方,做了一半或80%
NhibernateContrib提供了Hbm2Net和Hbm2DDL 两个工具,用于完成由hbm.xml 生成C#类和SQL语句的能力
其中Nhibernate.tool.hbm2ddl空间已经有了SchemaExport类用于完成Hbm2Ddl功能,当然,如果你需要,也可以将其封装一下,做成控制台应用程序或其他
另外Contrib里有Hbm2Net程序集,它还带了其控制台封装,可以用
Nhibernate.Contrib.Hbm2Net.Console.exe a.hbm.xml这样的形式来生成程序集
但是,它的问题是功能很不完整,很简陋
1,生成的文件名,都是example.cs,显然,看起来像个演示,而不是一个正式的程序
2,生成的文件,会以命名空间生成文件夹来放,这显然跟我们平时使用习惯不一样,我们习惯于将域实体类放在同一文件夹
3,无法支持通与符
4,虽然有--output参数,可是,试过了,发现,没法指定输出位置

不过,既然提供了这个功能,就算简陋,可是,只要我们动动脑筋,就会变化出真正实用的工具来