天天看點

NHibernate學習之一——如何配置NHibernate

一、基礎介紹

1.Hibernate是Java中比較流行的ORM架構,他在.NET中有一個對應的版本叫NHibernate,在EF出來之前NHibernate是.NET中常用的ORM架構;

二、配置NHibernate

1.配置環境:NHibernate版本為3.3.3.4001,VS2012,SqlServer2012; 2.項目整體結構如下圖:

NHibernate學習之一——如何配置NHibernate

其中DB為資料通路層,Entitys為實體,Mappings為實體對應的配置。 3.我們可以使用VS2012自帶的NuGet程式包管理器來下載下傳和安裝NHibernate,打開該工具包之後輸入NHibernate搜尋,找到之後點選安裝即可,他會為目前項目自動安裝并将所需的dll引入到項目中,同時會在項目下面生産一個packages檔案夾用于存放所需的dll等檔案。當然我們也可以自己去官網下載下傳,手動引入,建議還是使用這個工具比較友善;

NHibernate學習之一——如何配置NHibernate

4.添加實體對象:實體和資料庫中的表是對應的

namespace NHibernateTest.Entitys
{
    /// <summary>
    /// 使用者登入日志
    /// </summary>
    public class PM_LoginLog
    {
        #region Properties

        /// <summary>
        /// 擷取或設定登入使用者ID
        /// </summary>
        public virtual string UserID
        {
            get;
            set;
        }


        /// <summary>
        /// 擷取或設定登入使用者名
        /// </summary>
        public virtual string UserName
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定登入使用者密碼
        /// </summary>
        public virtual string PassWord
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定登入時間
        /// </summary>
        public virtual DateTime LoginDT
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定退出時間
        /// </summary>
        public virtual DateTime LogoutDT
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定是否記住密碼 0=未記住密碼 1=已記住密碼
        /// </summary>
        public virtual byte RememberPassWord
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定是否删除 0=未删除 1=已删除
        /// </summary>
        public virtual byte IsDelete
        {
            get;
            set;
        }

        /// <summary>
        /// 是否正常退出 0=未正常退出 1=已正常退出
        /// </summary>
        public virtual byte IsNormalExit
        {
            get;
            set;
        }

        #endregion
    }
}
           
namespace NHibernateTest.Entitys
{
    /// <summary>
    /// 使用者資訊實體類
    /// </summary>
    public class PM_Users
    {
        #region Properties

        /// <summary>
        /// 擷取或設定使用者ID
        /// </summary>
        public virtual string UserID
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定使用者姓名
        /// </summary>
        public virtual string UserName
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定使用者密碼
        /// </summary>
        public virtual string PassWord
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定使用者角色,0=普通角色 1=管理者角色
        /// </summary>
        public virtual byte Roles
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定傳真
        /// </summary>
        public virtual string Fax
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定電話号碼
        /// </summary>
        public virtual string TelPhone
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定位址
        /// </summary>
        public virtual string Address
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定郵箱位址
        /// </summary>
        public virtual string MailAddress
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定建立使用者ID
        /// </summary>
        public virtual string CreateUserID
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定建立時間
        /// </summary>
        public virtual DateTime CreateDT
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定最後修改使用者ID
        /// </summary>
        public virtual string LastUserID
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定最後修改時間
        /// </summary>
        public virtual DateTime LastChangeDT
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定序号
        /// </summary>
        public virtual int ListOrder
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定是否删除,0=未删除 1=已删除
        /// </summary>
        public virtual byte IsDelete
        {
            get;
            set;
        }

        /// <summary>
        /// 擷取或設定性别, 0=男 1=女
        /// </summary>
        public virtual byte Sex
        {
            get;
            set;
        }

        /// <summary>
        /// 是否已登入, 0=未登入 1=已登入
        /// </summary>
        public virtual byte IsLogin
        {
            get;
            set;
        }

        #endregion
    }
}
           

這個地方需要注意:實體屬性必須加 virtual關鍵字 5.為實體配置xml檔案:該配置檔案必須以“.hbm.xml”為字尾名,如:實體PM_LoginLog的配置檔案名為“PM_LoginLog.hbm.xml”,配置如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateTest" namespace="NHibernateTest.Entitys">
  <!--PM_LoginLog實體配置-->
  <class name="NHibernateTest.Entitys.PM_LoginLog,NHibernateTest" table="PM_LoginLog">
    <id name="UserID" column="UserID" type="string" unsaved-value="0">
      <generator class="increment"/>
    </id>
    <property name="UserName" column="UserName" type="string"  />
    <property name="PassWord" column="PassWord" type="string"  />
    <property name="LoginDT" column="LoginDT" type="DateTime"  />
    <property name="LogoutDT" column="LogoutDT" type="DateTime"  />
    <property name="RememberPassWord" column="RememberPassWord" type="byte"  />
    <property name="IsDelete" column="IsDelete" type="byte"  />
    <property name="IsNormalExit" column="IsNormalExit" type="byte"  />
  </class>

  <!--PM_Users實體配置,如果已經指定了assembly和namespace,class的name屬性中就不用再指定了-->
  <class name="PM_Users" table="PM_Users">
    <id name="UserID" column="UserID" type="string" unsaved-value="0">
      <generator class="increment"/>
    </id>
    <property name="UserName" column="UserName" type="string"  />
    <property name="PassWord" column="PassWord" type="string"  />
    <property name="Roles" column="Roles" type="byte"  />
    <property name="Fax" column="Fax" type="string"  />
    <property name="TelPhone" column="TelPhone" type="string"  />
    <property name="Address" column="Address" type="string"  />
    <property name="MailAddress" column="MailAddress" type="string"  />
    <property name="CreateUserID" column="Address" type="string"  />
    <property name="CreateDT" column="CreateDT" type="DateTime"  />
    <property name="LastUserID" column="LastUserID" type="string"  />
    <property name="LastChangeDT" column="LastChangeDT" type="DateTime"  />
    <property name="ListOrder" column="ListOrder" type="int"  />
    <property name="IsDelete" column="IsDelete" type="byte"  />
    <property name="Sex" column="Sex" type="byte"  />
    <property name="IsLogin" column="IsLogin" type="byte"  />
  </class>
</hibernate-mapping>
           

此處需要注意:必須将該檔案屬性中的“生産操作”欄由“内容”改為“嵌入的資源”,因為NHibernate是通過查找程式集中的資源檔案映射實體

6.配置資料庫,可以再應用程式配置檔案裡面,也可以單獨在檔案裡面配置 (1)在應用程式配置檔案(App.config)裡面配置,配置如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate"/>
  </configSections>

  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
      <property name="connection.connection_string">
        Data Source=.;Initial Catalog=PM_Database;Persist Security Info=True;User ID=sa;pwd=221580
      </property>
      <property name="proxyfactory.factory_class">NHibernate.Bytecode.DefaultProxyFactoryFactory,NHibernate</property>
      <property name="show_sql">true</property>
      <property name="command_timeout">10</property>
      <property name="adonet.batch_size">10</property>
      <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
      <mapping assembly="NHibernateTest"/>
    </session-factory>
  </hibernate-configuration>
</configuration>
           

(2)在單獨的檔案裡面配置, 檔案名為:hibernate.cfg.xml,需要将該檔案屬性中“複制到輸出目錄”項由“不複制”改為“始終複制”。如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">
      Data Source=.;Initial Catalog=PM_Database;Persist Security Info=True;User ID=sa;pwd=221580
    </property>
    <property name="proxyfactory.factory_class">NHibernate.Bytecode.DefaultProxyFactoryFactory,NHibernate</property>
    <property name="show_sql">true</property>
    <property name="command_timeout">10</property>
    <property name="adonet.batch_size">10</property>
    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
    <mapping assembly="NHibernateTest"/>
  </session-factory>
</hibernate-configuration>
           

7.DB中的NHibernateHelper類

namespace NHibernateTest.DB
{
    public class NHibernateHelper
    {
        #region Properties

        /// <summary>
        /// 擷取Session會話
        /// </summary>
        public static ISession GetSession
        {
            get
            {
                return GetSessionFactory().OpenSession();
            }
        }

        #endregion

        #region Private Methods

        /// <summary>
        /// 擷取Session工廠
        /// </summary>
        /// <returns></returns>
        private static ISessionFactory GetSessionFactory()
        {
            return (new Configuration()).Configure().BuildSessionFactory();
        }

        #endregion
    }
}
           

8.DB中的PM_LoginLogDao

namespace NHibernateTest.DB
{
    public class PM_LoginLogDao
    {
        #region Fields

        private ISession _session = null;

        #endregion

        #region Constructors

        /// <summary>
        /// 初始化類PM_LoginLogDao的新執行個體
        /// </summary>
        public PM_LoginLogDao()
        {
            this._session = NHibernateHelper.GetSession;
        }

        #endregion

        #region Public Methods

        /// <summary>
        /// 添加一條日志記錄
        /// </summary>
        /// <param name="loginLog"></param>
        public void Save(PM_LoginLog loginLog)
        {
            this._session.Save(loginLog);
            this._session.Flush();
        }

        /// <summary>
        /// 根據登入使用者ID擷取登入日志
        /// </summary>
        /// <param name="userID"></param>
        /// <returns></returns>
        public PM_LoginLog GetLoginLog(string userID)
        {
            return this._session.Get<PM_LoginLog>(userID);
        }

        /// <summary>
        /// 擷取所有登入日志
        /// </summary>
        /// <returns></returns>
        public IList<PM_LoginLog> GetAllLoginLog()
        {
            IList<PM_LoginLog> pList = null;
            pList = this._session.QueryOver<PM_LoginLog>().List();

            return pList;
        }

        #endregion
    }
}
           

9. DB中的 PM_UsersDao

namespace NHibernateTest.DB
{
    public class PM_UsersDao
    {
          #region Fields

        private ISession _session = null;

        #endregion

        #region Constructors

        /// <summary>
        /// 初始化類PM_LoginLogDao的新執行個體
        /// </summary>
        public PM_UsersDao()
        {
            this._session = NHibernateHelper.GetSession;
        }

        #endregion

        #region Public Methods

        /// <summary>
        /// 添加一條登入使用者
        /// </summary>
        /// <param name="loginLog"></param>
        public void Save(PM_Users user)
        {
            this._session.Save(user);
            this._session.Flush();
        }

        /// <summary>
        /// 根據登入使用者ID擷取登入使用者
        /// </summary>
        /// <param name="userID"></param>
        /// <returns></returns>
        public PM_Users GetUser(string userID)
        {
            return this._session.Get<PM_Users>(userID);
        }

        /// <summary>
        /// 擷取所有使用者
        /// </summary>
        /// <returns></returns>
        public IList<PM_Users> GetAllUser()
        {
            IList<PM_Users> pList = null;
            pList = this._session.QueryOver<PM_Users>().List();

            return pList;
        }

        #endregion
    }
}
           

10.調用

namespace NHibernateTest
{
    public class Program
    {
        public static void Main(string[] args)
        {
            PM_LoginLogDao pLoginLogDao = new PM_LoginLogDao();
            var pLoginList = pLoginLogDao.GetAllLoginLog();
            var pLogin = pLoginLogDao.GetLoginLog("katrina");

            PM_UsersDao pUserDao = new PM_UsersDao();
            var pUserList = pUserDao.GetAllUser();
            var pUsr = pUserDao.GetUser("katrina");
        }
    }
}
           

繼續閱讀