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
}
}










