目前NHibernate的最新版是3.3.2,官方下载地址:http://sourceforge.net/projects/nhibernate/files/NHibernate/
下载后解压NHibernate.dll、Iesi.Collections.dll放到固定目录(可以在解决方案下新建个Lib目录,放进去),另外如果使用Mysql数据库,还要找个版本合适的Mysql.data.dll文件。
现在,我们仅是为了配置NHibernate环境,并且测试是否成功,所以我们直接在Web项目中添加这三个dll的引用,,并直接在控制器中编写数据访问代码。
一、编写实体类
在Model项目中创建实体类:User,内容如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LMJ.Model { public class User { public String Code { get; set; } public String Name { get; set; } public int Age { get; set; } } }
实体类中的属性及其类型与数据表相对应,具体如何映射由配置文件设置。
二、编写实体映射文件
在Model项目中创建目录:Mapping,并在里面创建User.hbm.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="LMJ.Model" assembly="LMJ.Model"> <class name="User" table="`user`" lazy="false"> <id name="Code" column="Code" type="String"> <generator class="assigned" /> </id> <property name="Name" column="Name" type="String" length="50" /> <property name="Age" column="Age" type="int" /> </class> </hibernate-mapping>
比如这里:
1、namespace配置实体类所在的命名空间,assembly配置实体类文件名(也就是Model项目生成的dll文件名);
2、class节点中的 name 属性映射实体类的名称;table 映射数据表的名称,名称两边的“·”(Tab键上面的字符)处理特殊的表名,相当于MS SQL中的“[User]”(NHibernate会自动根据数据库类型进行处理);lazy配置是否延迟加载。
3、class中的id配置数据表主键,name是实体类的属性名称,column是数据表中的列名,type就是字段类型了;generator定义主键类型,这个类型比较多,具体有如下几个(网上摘抄):
1) increment
increment: 对 long , short 或 int 的数据列生成自动增长主键。
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:如果当前有多个实例访问同一个数据库,那么由于各个实例各自维护主键状态,不同实例可能生成同样的主键,从而造成主键重复异常。因此,如果同一数据库有多个实
例访问,此方式必须避免使用。
2) identity
对如 SQL server , MySQL 等支持自动增长列的数据库,如果数据列的类型是 long, short 或 int ,可使用主键生成器生成自动增长主键。
3) seqhilo
对如 Oracle , DB2 等支持 Sequence 的数据库,如果数据列的类型是 long,short 或 int ,可使用该主键生成器生成自动增长主键。 对 Sequence 解释可以参见 http://easyworld.javaeye.com/blog/214098
4)uuid:
对字符串列的数据采用 128-位 uuid 算法生成唯一的字符串主键。
5) hilo
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。
6) foreign
使用外部表的字段作为主键。
7) native
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式,这种方式我在开法过程中经常用到,意思是把主键的生成方式交给底层数据库来决定。
8) assigned
主键由外部程序负责生成,无需Hibernate参与。
9) uuid.hex
由Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后以长度32 的字符串表示)作为主键。
10) uuid.string
与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些数据库中可能出现问题(如PostgreSQL)。
一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。
4、property节点定义数据表中的每一个字段是如何与实体类中的属性映射的,这里不啰嗦了,可以搜索一下。
三、编写控制器及Action
在Manage区域中添加控制器:UserController,内容如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Collections; using NHibernate; using NHibernate.Cfg; namespace LMJ.Web.Areas.Manage.Controllers { public class UserController : Controller { public ActionResult Index() { int i = 0; ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory(); ISession session = sessionFactory.OpenSession(); if (session != null) { IList results = session.CreateQuery("from User").List(); i = results.Count; session.Close(); } ViewData["message"] = "数据集总数:" + i; return View(); } } }
Web项目中的“\Areas\Manage\Views\User”目录中添加Index.cshtml,内容如下:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div> @ViewData["message"] </div> </body> </html>
在Web项目根目录中创建hibernate.cfg.xml(NHibernate会自动搜索),内容如下:
mysql配置:
<?xml version="1.0" encoding="utf-8" ?> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <session-factory> <!-- properties --> <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property> <property name="connection.connection_string">Database=lmj;Data Source=localhost;User Id=root;Password=root</property> <property name="dialect">NHibernate.Dialect.MySQL5Dialect</property> <property name="show_sql">true </property> <property name="hbm2ddl.keywords">none</property> <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property> <mapping assembly="LMJ.Model"/> </session-factory> </hibernate-configuration>
<?xml version="1.0" encoding="utf-8" ?> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <session-factory> <!-- properties --> <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> <property name="connection.driver_class">NHibernate.Driver.Sql2008ClientDriver</property> <property name="connection.connection_string">Database=lmj;Data Source=localhost;User Id=sa;Password=root</property> <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> <property name="show_sql">true </property> <property name="hbm2ddl.keywords">none</property> <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property> <mapping assembly="LMJ.Model"/> </session-factory> </hibernate-configuration>
六、测试访问
根据项目实际情况,进行测试访问,最后会输出User表中的数据集总数。
下一篇开始配置Spring.NET环境。