NHibernate用法的例子

Kaisir最近在做的小项目中一直有在使用大名鼎鼎的Hibernate的.Net版本–NHibernate,百度了下下,发现可以参考的例子非常少,就把自己在应用过程中的例子拿出来,供大家参考。也方便自己下次配置时不用再到处找资料了。这篇文章不深究Nhibernate的实现,想要了解如何实现的童鞋,可以继续Google下~~不过也不排除等空闲的时候自己阅读下源代码,来篇NHibernate源码分析 哇哈哈~
一般的框架集都是通过配置文件来进行配置的,NHibernate也不例外,且NHibernate的配置分为两部分,基础配置及数据实体配置。
(一)基础配置
对于Nhibernate来说,基础配置主要体现在对web.config的配置。在其中,我们定义了他要连接数据库的基本信息,以及以什么形式连接数据库,此外,还可以在这里增加调试(log4net)信息的输出。当然,首先要做的,还有在<configSections>段增加NHibernate程序集本身的信息。
[codesyntax lang=”xml” blockstate=”expanded”]

<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.2.0.3001,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>

[/codesyntax]
[codesyntax lang=”xml”]

<nhibernate>
	<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
	<add key="hibernate.dialect" value="NHibernate.Dialect.GenericDialect"/>
	<add key="hibernate.connection.driver_class" value="NHibernate.Driver.OleDbDriver"/>
	<add key="hibernate.connection.connection_string" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|djshfk34234.mdb"/>
</nhibernate>

[/codesyntax]

(二)实体配置
实体(Model)这个概念应该不单单是Nhibernate中存在的概念,凡是涉及到以整个对象进行操作的组件,都会有这个概念,且实体是程序中对数据结构最底层的抽象之一。这里,我们首先需要将实体设计的类写出:

[codesyntax lang="csharp"]
public class Category
    {
        private string _c_ID=Guid.NewGuid().ToString();
        private string _c_Name="";
        private string _c_Order="0";
        private string _c_Intro="";
        private string _c_Url="";
        private DateTime _c_Time=DateTime.Now;
        #region Constructors
        public Category()
        {
        }
        #endregion
        #region Properties
        public virtual string C_ID
        {
            get { return _c_ID; }
            set { _c_ID = value; }
        }
        public virtual string C_Name
        {
            get { return _c_Name; }
            set { _c_Name = value; }
        }
        public virtual string C_Order
        {
            get { return _c_Order; }
            set { _c_Order = value; }
        }
        public virtual string C_Intro
        {
            get { return _c_Intro; }
            set { _c_Intro = value; }
        }
        public virtual string C_Url
        {
            get { return _c_Url; }
            set { _c_Url = value; }
        }
        public virtual DateTime C_Time
        {
            get { return _c_Time; }
            set { _c_Time = value; }
        }
        #endregion
    }
}

[/codesyntax]
在写出实体类之后,我们便可以依照实体中具体字段与数据库字段的对应关系,写出相应的配置文件,注意,这里配置文件必须以实体名.hbm.xml的形式命名。且这个配置文件的属性,必须更改为嵌入。
[codesyntax lang=”xml”]

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Model.Category,Model" table="c_category">
    <id name="C_ID" column="C_ID" type="String">
      <generator class="assigned"/>
    </id>
    <property name="C_Name" column="C_Name" type="String"/>
    <property name="C_Order" column="C_Order" type="String"/>
    <property name="C_Intro" column="C_Intro" type="String"/>
    <property name="C_Url" column="C_Url" type="String"/>
    <property name="C_Time" column="C_Time" type="DateTime"/>
  </class>
</hibernate-mapping>

[/codesyntax]
经过了以上简单的配置,我们的NHibernate应该已经可以正常工作了,下面要做的只是通过SessionFactory的OpenSession方法创建Session对象,并使用BeginTransaction,创建事务,接下来要做的只是把用填充好的实体带到Session的save()等CRUD方法中,并使用Transaction的commit进行提交,就Ok鸟~~

[codesyntax lang="csharp"]
public void AddEntity(Object entity)
        {
            ISession session = SessionFactory.OpenSession(_AssemblyName);
            ITransaction transaction = session.BeginTransaction();
            try
            {
                session.Save(entity);
                transaction.Commit();
            }
            catch (Exception ex)
            {
                transaction.Rollback();
                throw ex;
            }
            finally
            {
                session.Close();
            }
        }
        public static ISession OpenSession(string AssemblyName)
        {
            if (sessions==null)
            {
                lock (padlock)
                {
                    if (sessions==null)
                    {
                        BuildSessionFactory(AssemblyName);
                    }
                }
            }
            return sessions.OpenSession();
        }
        private static void BuildSessionFactory(string AssemblyName)
        {
            cfg = new Configuration();
            cfg.AddAssembly(AssemblyName);
            sessions = cfg.BuildSessionFactory();
        }
    }

[/codesyntax]