介绍以及如何用

NHibernate 来源于java中的hibernate , 主要是把面向 对象编程和关系数据库sql关联起来, 作用于数据持久化的编程中 ,把数据库的表和程序中的类做成一一对应的映射,通过一个hbm的映射文件进行关联。

官方:https://nhibernate.info/

当前版本:NH5.2.7

官方入门:https://nhibernate.info/doc/tutorials/first-nh-app/your-first-nhibernate-based-application.html

1.前提准备引入相关类

下载以后,打包压缩包,找到以下几个dll 拷到自己的共享dll中。 还有一个是Antlr3.Runtime.dll ,这个类是关于处理自然语言的。 翻译成相关的sql .

1585394934257

然后根据自己使用的数据库,把相应数据库的dll 也拷到里面。 如,你用的数据库是mysql,要拷贝mysql.data.dll

2.添加 nhibernatehelp方法

方便 调用 ,代码中有注释 ,主要是通过数据库配置文件,建立一个session工厂,同时维护这个session使用在使用的时候调用 。

public class NHibernateHelper
{
    private static ISessionFactory _sessionFactory;

    private static ISessionFactory SessionFactory
    {
        get
        {
            if(_sessionFactory == null)
            {
                //先实例化nh配置类
                var configuration = new Configuration();
                //调用自带的配置,会默认读取输出目录的hibernate.cfg.xml 
                configuration.Configure();
                //在程序集中找对应的mapping文件 ,要保证Product.hbm.xml属性是设置为
                //嵌入资源,同时mapping文件中class name是product.
                configuration.AddAssembly(typeof(Product).Assembly);
                //建立一个session工厂,因为是该步是一个expensive pocess,所以在程序
                //中我们定义一个全局变量,只保证执行一次就可以。
                _sessionFactory = configuration.BuildSessionFactory();
            }
            return _sessionFactory;
        }
    }

    public static ISession OpenSession()
    {
        return SessionFactory.OpenSession();
    }
}

3.调用

通常情况下,建立一个实体对应的接口类, 在类中增加crud操作,同时在实现中,对接口类进行实现。

先通过nhibernateHelp方法,打开opensession 会取读默认的配置文件 ,同时加载hmb.xml的映射文件,然后调用BuildSessionFactory, 在使用的时候 直接 opensession就可以。

using (ISession session = NHibernateHelper.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
    session.Save(product);
    transaction.Commit();
}

4.类属性定义为virtual

因为nhibernate默认使用延迟加载,所以我们要在类属性中设置为virtual ,否则为报错

xxx should be virtual .

public class Product
    {
        public virtual Guid Id { get; set; }
        public virtual string Name { get; set; }
        public virtual string Category { get; set; }
        public virtual bool Discontinued { get; set; }
    }

使用注意事项

1.AddAssembly

添加程序集中嵌入的资源文件 (以hbm.xml)结尾的。

添加 映射信息的时候 ,如果xxx.hbm.xml是在本项目中。 则使用

configuration.AddAssembly(this.GetType().Assembly);

如果xxx.hbm.xml,放在新的项目中{单独mapping的一个类}则使用

configuration.AwyddAssembly("Mapping");

2.Mapping的使用注意

a.必须以hbm.xml结尾

b.属性中要定义成嵌入的资源 。

1585392608844

3.BuildSessionFactory

在使用BuildSessionFactory()时,如果是使用的nhibernate3 版本则可以这样使用。

Configuration configuration = new Configuration();
SessionFactory sf = configuration.buildSessionFactory();

在nh3以后的版本,要定义一个service

StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder();
ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();
SessionFactory sf = configuration.buildSessionFactory(serviceRegistry);

该代码中分别创建 BootstrapServiceRegistry, ServiceRegistrySessionFactoryServiceRegistry.

具体使用以后再分析,咱们用nh主要是用于处理orm的。

可以参考:https://www.open-open.com/lib/view/open1356339689713.html

4.nhibernate-mapping

在有些自动化生成的工具中,这里是2.0 要注意修改,如果是2.0 会报错。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0"

在最新版本中。则定义是2.2

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"

5.关于主键id

如果主键是GUID,则使用

public Guid Id { get; set; }
<generator class="guid" />

如果主键是自增int,则使用

 <id name="Id" column="id" type="int">
      generator< class="identity" />
</id>

本文由 hcb 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论