NHibernate Cookbook 学习笔记 1 Mapping a class with XML

下载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

这种类型的键生成器,不要求实体对象立刻插入数据库,而是允许事务提交后,再将此对象插入数据库中,这种方式减少了数据访问次数。

主要有如下几种生成器:

hiloguidguid.combuuid.hexuuid.stringcounterincrementsequenceseqhiloforeign

搞这么多实在是蛋疼,实际上用guid.combok了,没必要搞这么多

 

另一种类型是Post-insert POID generators

这种键,是因为程序要求实体立刻插入系统的情况下

identityselectsequence-identitytrigger-identity

一般用不到这个,用到的时候,再去差这几种类型的生成逻辑吧,或者,随便用一样就ok

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值