在C#项目中如何使用NHibernate详解

2020-01-05 09:10:10王冬梅

4. 编写NHibernateHelper辅助类

文件:NHibernateHelper.cs


using System;
using Fuli.Tool.Log;
using NHibernate;
using NHibernate.Cfg;
namespace Fuli.DAL.Common
{
 public class NHibernateHelper
 {
 private static ISessionFactory _sessionFactory;
 private static ISessionFactory SessionFactory
 {
  get
  {
  if (_sessionFactory == null)
  {
   var configuration = new Configuration();
   configuration.Configure();
   _sessionFactory = configuration.BuildSessionFactory();
  }
  return _sessionFactory;
  }
 }

 public static ISession OpenSession()
 {
  try
  {
  return SessionFactory.OpenSession();
  }
  catch (Exception ex)
  {
  LogHelper.GetInstance().WriteMessage("打开数据库失败,错误:" + ex.ToString());
  return null;
  }
 }
 }
}

5. 创建数据模型

NHibernate允许直接使用Plain Old CLR Objects (POCOs),而不用通过存储过程来直接和数据库交互。使用POCOs的一个优势在于不用绑定特定的持久化层。相比较而言,有些ORM解决方案需要特殊属性,或者是基于模型对象,这些对象又是从特定的基类中继承而来的。

在NHibernate中不用特殊的修饰就可以让对象和持久化层交互。要注意的是所有需要持久化的属性必须是虚拟的,并且要开启延迟加载,所有数据模型类中的公共方法必须是虚拟的,哪怕它们并没有包含到映射文件中。

通常来讲,最好把所有的属性都设置为虚拟的。

可以借助MyGeneration自动代码工具从数据表生成数据模型和对应的映射文件。


using System;
using System.Collections.Generic;

namespace Fuli.Entity.Domain
{
 /// <summary>
 /// 共享编码表(字典表)
 /// </summary>
 [Serializable]
 public class SharedCode
 {
 #region 构造方法

 public SharedCode()
 {
  m_Id = 0;
  m_Category = string.Empty;
  m_Text = string.Empty;
  m_Value = string.Empty;
  m_IsDefault = false;
  m_Description = string.Empty;
  m_ParentId = 0;
  m_SortOrder = 0;
 }

 #endregion 构造方法

 #region 私有变量

 private long m_Id;
 private string m_Category;
 private string m_Text;
 private string m_Value;
 private bool m_IsDefault;
 private string m_Description;
 private long m_ParentId;
 private short m_SortOrder;

 #endregion 私有变量

 #region 公有属性

 ///<summary>
 /// 主键Id
 ///</summary>
 public virtual long Id
 {
  get { return m_Id; }
  set { m_Id = value; }
 }

 ///<summary>
 /// 分类
 ///</summary>
 public virtual string Category
 {
  get { return m_Category; }
  set { m_Category = value; }
 }

 ///<summary>
 /// 文本
 ///</summary>
 public virtual string Text
 {
  get { return m_Text; }
  set { m_Text = value; }
 }

 ///<summary>
 /// 编码值
 ///</summary>
 public virtual string Value
 {
  get { return m_Value; }
  set { m_Value = value; }
 }

 ///<summary>
 /// 是否是同类里默认
 ///</summary>
 public virtual bool IsDefault
 {
  get { return m_IsDefault; }
  set { m_IsDefault = value; }
 }

 ///<summary>
 /// 描述
 ///</summary>
 public virtual string Description
 {
  get { return m_Description; }
  set { m_Description = value; }
 }

 ///<summary>
 /// 父级Id(如果有)
 ///</summary>
 public virtual long ParentId
 {
  get { return m_ParentId; }
  set { m_ParentId = value; }
 }

 ///<summary>
 /// 排列次序
 ///</summary>
 public virtual short SortOrder
 {
  get { return m_SortOrder; }
  set { m_SortOrder = value; }
 }

 #endregion 公有属性

 #region 扩展属性

 #endregion 扩展属性

 #region Rewrite Equals and HashCode

 /// <summary>
 /// 
 /// </summary>
 public override bool Equals(object obj)
 {
  if(this == obj) return true;
  if((obj == null) || (obj.GetType() != GetType())) return false;
  SharedCode castObj = (SharedCode)obj;
  return (castObj != null) && (m_Id == castObj.Id);
 }

 /// <summary>
 /// 用唯一值实现GetHashCode
 /// </summary>
 public override int GetHashCode()
 {
  int hash = 57;
  hash = 27 * hash * m_Id.GetHashCode();
  return hash;
 }

 #endregion Rewrite Equals and HashCode
 }
}