下载Nhibernate:解压到你自己的类库文件夹,怎么下载,和到哪里下载,您去搜一下,创建解决方案,引用相关的dll,这里注意创建一个Schema项目文件夹,里面的2文件是require-bin中的文件,用来做xml文件校验的,同时为nhibernate文件提供智能感知的功能,完成之后应该是像下面这样的:
建立2个类
一个是所有实体的基类:
namespace NStudy.core {
public abstract class Entity {
public virtual Guid Id { get; set; }
}
}
一个是我们要映射到数据库的实体类,商品类
namespace NStudy.core {
public class Product :Entity{
public virtual string Name { get; set; }
public virtual string Description { get; set; }
public virtual decimal UnitPrice { get; set; }
}
}
再添加一个映射文件,这个因为前面添加的schema会有智能感知的功能
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NStudy.core" namespace="NStudy.core">
<class name="Product">
<id name="Id">
<generator class="guid.comb" />
</id>
<property name="Name" not-null="true"></property>
<property name="Description" ></property>
<property name="UnitPrice" not-null="true" type="Currency"></property>
</class>
</hibernate-mapping>
解释一些概念:
一个model表示一组会被持久化的类,这些个model中的类最终会被持久话或存储在数据库中,一个持久化类表示一个将最终被持久化在媒介中的类,一个实体类指的是带有一个ID的持久化类,一个实体是实体类的一个实例。这几个类要分清楚。比如在我们这个解决方案的model中只含有一个product实体类
在NH中有一个POID的概念,这个id用来标识实体在内存中的唯一性,就像一条数据在数据库中的主键一样,通常这个POID就映射到数据库中的主键上面。他们的定义通常像如下的定义。
public virtual Guid Id { get; protected set; }
关于配置文件名称一定是要保持这样的格式:a.hbm.xml,并且设置这个文件的生成操作为“嵌入的资源”NH会从程序集中找这些个配置文件,加载每一个以这种格式结尾的配置文件。如果您的程序报错:No Persister for class,那么很可能就是没有设置成嵌入的资源。
至于这个配置文件中每一个节点的意义,我相信不用我解释就能看的明白,就是注意generator这个是生成POID的方式,可以有很多种生成的方式,呆会总结,assembly="NStudy.core"namespace="NStudy.core"这个是可以省掉的,那么就要求您在<classname="Product">中写全称:<class name="NStudy.core.Product,NStudy.core">,这个很容易理解
完成了之后,我们在数据库中的数据表格式应该是这样:
在NH中有3种开发方式:
1.Model-first,先写model,再配置config,然后根据这2样东西生成数据库和表
2.config-first,先搞配置文件,在做model,然后生成数据库
3.database-first这种就是普通的开发,一般不建议这么做,除非是在现有的数据库上做开发。
顺便说一下代理键和自然键
这2个键都是用来标识一个唯一的数据项或者对象,代理键是凭空生成的,没有任何意义,比如一个customer表中的id,这个id没有任何具体的意义,他就是用来表示这条数据,自然键不同,它有特殊的意义,还是这个customer表,username就是一个自然键(如果不允许重名的话),现在一般建议每个数据表都加一个代理键,原因是自然键很可能出现组合键,特麻烦,而且自然键有时候会遇到需要修改的情况,比如用户名称修改,键修改是一个特麻烦的事情。
关于配置文件中的id生成器:
Non-insertPOID generators:
这种类型的键生成器,不要求实体对象立刻插入数据库,而是允许事务提交后,再将此对象插入数据库中,这种方式减少了数据访问次数。
主要有如下几种生成器:
hilo,guid,guid.comb,uuid.hex,uuid.string,counter,increment,sequence,seqhilo,foreign
搞这么多实在是蛋疼,实际上用guid.comb就ok了,没必要搞这么多
另一种类型是Post-insert POID generators
这种键,是因为程序要求实体立刻插入系统的情况下
identity,select,sequence-identity,trigger-identity
一般用不到这个,用到的时候,再去差这几种类型的生成逻辑吧,或者,随便用一样就ok啦