介绍以及如何用
NHibernate 来源于java中的hibernate , 主要是把面向 对象编程和关系数据库sql关联起来, 作用于数据持久化的编程中 ,把数据库的表和程序中的类做成一一对应的映射,通过一个hbm的映射文件进行关联。
当前版本:NH5.2.7
官方入门:https://nhibernate.info/doc/tutorials/first-nh-app/your-first-nhibernate-based-application.html
1.前提准备引入相关类
下载以后,打包压缩包,找到以下几个dll 拷到自己的共享dll中。 还有一个是Antlr3.Runtime.dll ,这个类是关于处理自然语言的。 翻译成相关的sql .
然后根据自己使用的数据库,把相应数据库的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.属性中要定义成嵌入的资源 。
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, ServiceRegistry 和 SessionFactoryServiceRegistry.
具体使用以后再分析,咱们用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>
还不快抢沙发