NHibernate的学习始于在JAVA中对Hibernate的学习,不过,在Java中,使用Eclipse集成的Hibernate开发环境用起来很是顺手,但在.net中,对初学NHibernate的人而言,简直是让人抓狂,仅是配置文件就让人痛不欲生。

首先,当然是去下载NHibernate啦,网上一找一把,每个版本都有不同的配置,仅是这一个原因,就能够让人怕了,我下了2.1.1版本的,参考着其它书籍中所述,先写hibernate.hbm.xml配置文件,代码如下:

Code

运行以后给我报个这样的错

用户代码未处理 NHibernate.Bytecode.ProxyFactoryFactoryNotConfiguredException
  Message="The ProxyFactoryFactory was not configured.\r\nInitialize 'proxyfactory.factory_class' property of the session-factory configuration section with one of the available NHibernate.ByteCode providers.\r\nExample:\r\n<property name='proxyfactory.factory_class'>NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>\r\nExample:\r\n<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>"

哈,这个错就是2.1.1版本的新特性了,所以Hibernate.hbm.xml文件里一定要加上<property name='proxyfactory.factory_class'>这个节

OK,改过以后,这块儿的错没了。而接下来却是

<mapping resource="" assembly="" />这个节,这个节所要注意的是assembly指的是resource指向的文件的目录,而不是程序集,否则,配错了又会弹出个框框说找不到资源文件了:)

 

再往下看,该配置实体类了,写了一个物料名称的实体类,代码如下:

 

Code

 

配置文件如下:

 

Code

 

保存,生成以后,运行又报下错:

Could not find a getter for property 'MaID' in class 'QCM.Entity.MaList'

这下可就搞晕糊了,数据库中列的名字是MaID啊,于是上网找找,呵,遇到和我一样问题的还不在少数,哈哈,于是再仔细的对,终于发现name中的MaID与实体类中的MaId还是有些区别的,于是再改,再运行,成功!

 

其实学习中遇到的问题远不止如下,在这儿也给和我一样的菜鸟一点建议:

1.注意看NHibernate自带例子配置,<property name='proxyfactory.factory_class'>这个配置在例子Tests的实体配置文件中有(2.1.1版本中的名字是ABC.hbm.xml);

2.注意资源文件的路径,resource所指向的是文件目录,而不是程序集;

3.实体配置文件的“文件属性”中,“生成操作”应选“嵌入的资源”,否则会报“资源无法找到”的错误;

4.实体映射文件中,name的值应该和与其相对应的实体文件的属性名大小写一致,否则会报出“不能找到XX属性的getter方法”;

5.IDE默认在编写实体配置文件时是不会出现智能提示的,如果要智能提示,就将NHibernate目录下的*.xsd文件复制到“VS安装目录\Xml\Schemas\”目录下,这时编写实体配置文件时将会出现智能提示,虽然不如MS的提示多,但对于写个实体配置文件来说,算是够用了。

 

好啦,先写这些,今天总算是实现了插入功能,简单的增删改查并不难,关键是配置要正确。 当然,如果用CodeSmith来做配置,那是再好不过了。

 

补充一下,实体类中的public 要用虚方法哟。:)