NHibernate的学习始于在JAVA中对Hibernate的学习,不过,在Java中,使用Eclipse集成的Hibernate开发环境用起来很是顺手,但在.net中,对初学NHibernate的人而言,简直是让人抓狂,仅是配置文件就让人痛不欲生。
首先,当然是去下载NHibernate啦,网上一找一把,每个版本都有不同的配置,仅是这一个原因,就能够让人怕了,我下了2.1.1版本的,参考着其它书籍中所述,先写hibernate.hbm.xml配置文件,代码如下:

Code
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">Data Source=pcwoker\pcwoker;Initial Catalog=QCM;Persist Security Info=True;User ID=sa;Password=newsa</property>
<property name="show_sql">true</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<mapping resource="QCMModel.MaList.hbm.xml" assembly="QCMModel"/>
</session-factory>
</hibernate-configuration>
运行以后给我报个这样的错
用户代码未处理 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
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using NHibernate.ByteCode.Castle;
5 namespace QCM.Entity
6 {
7 public class MaList
8 {
9 /// <summary>
10 /// 品名ID
11 /// </summary>
12 private int maId;
13
14 /// <summary>
15 /// 品名ID
16 /// </summary>
17 public virtual int MaId
18 {
19 get { return maId; }
20 set { maId = value; }
21
22 }
23
24 /// <summary>
25 /// 品名
26 /// </summary>
27 private string maName;
28
29 /// <summary>
30 /// 品名
31 /// </summary>
32 public virtual string MaName
33 {
34 get { return maName; }
35 set { maName = value; }
36 }
37
38 public MaList()
39 {
40
41 }
42 ///<summary>
43 ///重载构造方法
44 /// </summary>
45 /// <param name="maid">品名ID</param>
46 /// <param name="maName">品名</param>
47 public MaList(int maid, string maName)
48 {
49 this.MaId = maid;
50 this.MaName = maName;
51 }
52 /// <summary>
53 /// 重写ToString方法
54 /// </summary>
55 /// <returns></returns>
56 public override string ToString()
57 {
58 return String.Format("品名信息:品名ID={0},品名={1}",
59 maId,
60 maName
61 );
62
63 }
64 }
65 }
66
配置文件如下:

Code
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="QCM.Entity.MaList,QCMModel" table="MaList">
<id name="MaID" column="MaId" type="Int32">
<generator class="native"></generator>
</id>
<property name="MaName" column="MaName" type="string" length="50" />
</class>
</hibernate-mapping>
保存,生成以后,运行又报下错:
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 要用虚方法哟。:)