ORM架构一抓一大把的,而所做的系统中,真正使用第三方的ORM架构很少,大多是自己写了一个简单的ORM架构,简单的数据库与实体对象的关系映射,如果考虑到性能增加一些缓存机制,在日常的系统开发中都能够满足要求。而在ORM开源架构中,Nhibernate则是如雷贯耳,使用第三方架构,带来的则是便利以及快捷,但是也给项目团队带来了学习的难度,学习Nhibernate的主要目的是思考如何架构ORM,如何处理实际问题中遇到的各种冲突,性能,代码生成等一系列的解决方案。
首先,需要准备一些工具:
1、下载Nhibernate For .Net 内库(2.0,3.0)
2、为了提高效率下载Code Smith
3、Nhibernate For .Net开发的相关Code Smith模版
初步了解:
抽象的概览
轻量级体系,应用程序自己提供ADO.NET连接,并且自行管理事务
重量级体系:所有的底层ADO.NET API都被抽象了
配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory name="NHibernate.Test">
<!--properties-->
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">Server=localhost;initial catalog=NHibernate;uid=sa;pwd=sa</property>
<property name="show_sql">false</property>
<property name="dialect">NHibernate.Dialect.MSSql2005Dialect</property>
<!--mapping files-->
<mapping assembly="TestNHibernate"/>
</session-factory>
</hibernate-configuration>
类结构:
public class User
{
private int _id;
private string _name;
private string _pwd;
public virtual int Id
{
get { return _id; }
set { _id = value; }
}
public virtual string Name
{
get { return _name; }
set { _name = value; }
}
public virtual string Pwd
{
get { return _pwd; }
set { _pwd = value; }
}
}
mapping xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="TestNHibernate.User,TestNHibernate" table="Users" lazy="false">
<id name="Id" column="Id" unsaved-value="0">
<generator class="native"/>
</id>
<property name="Name" column="Name" type="string" length="64" not-null="true" unique="true"></property>
<property name="Pwd" column="Pwd" type="string" length="64" not-null="true"></property>
</class>
</hibernate-mapping>
准备后以上文件后,就可以开始写代码了。
首先是Nhibernate的入口:SessionFactory,跟EF中的DataContent差不多
public sealed class NHibernateHelper
{
private static readonly ISessionFactory sessionFactory;
static NHibernateHelper()
{
sessionFactory = new Configuration().Configure("nhibernate.cfg.xml").BuildSessionFactory();
}
public static ISession GetCurrentSession()
{
ISession currentSession = sessionFactory.OpenSession();
return currentSession;
}
public static void CloseSessionFactory()
{
if (sessionFactory != null)
{
sessionFactory.Close();
}
}
}
创建表:
/// <summary>
/// 创建表
/// </summary>
/// <returns></returns>
public bool ExportTable()
{
try
{
Configuration cfg = new Configuration().Configure("nhibernate.cfg.xml");
//cfg.AddXmlFile("User.hbm.xml");
session = NHibernateHelper.GetCurrentSession();
ITransaction transaction = session.BeginTransaction();
new SchemaExport(cfg).Create(true, true);
transaction.Commit();
return true;
}
catch (Exception ex)
{
throw ex;
}
finally
{
session.Close();
}
}
添加:
/// <summary>
/// 添加数据
/// </summary>
/// <returns></returns>
public int Add()
{
try
{
User u = new User();
u.Name = "admin";
u.Pwd = "admin";
session = NHibernateHelper.GetCurrentSession();
ITransaction trans = session.BeginTransaction();
session.Save(u);
trans.Commit();
return u.Id;
}
catch (Exception ex)
{
throw ex;
}
finally
{
session.Close();
}
}
更新:
/// <summary>
/// 修改数据
/// </summary>
/// <param name="uid"></param>
/// <returns></returns>
public bool Update(int uid)
{
try
{
session = NHibernateHelper.GetCurrentSession();
ITransaction trans = session.BeginTransaction();
User u = session.Load(typeof(User), uid) as User;
if (u != null)
{
u.Name = "system";
session.SaveOrUpdate(u);
trans.Commit();
u = session.Load(typeof(User), uid) as User;
if (u.Name == "system")
{
return true;
}
}
return false;
}
catch (Exception ex)
{
throw ex;
}
finally
{
session.Close();
}
}
删除:
/// <summary>
/// 删除数据
/// </summary>
/// <param name="uid"></param>
/// <returns></returns>
public bool Delete(int uid)
{
try
{
session = NHibernateHelper.GetCurrentSession();
ITransaction trans = session.BeginTransaction();
User u = session.Get(typeof(User), uid) as User;
if (u != null)
{
session.Delete(u);
trans.Commit();
u = session.Get(typeof(User),uid) as User;
if (u == null)
{
return true;
}
}
return false;
}
catch (Exception ex)
{
throw ex;
}
finally
{
session.Close();
}
}
查询:
/// <summary>
/// 查询数据
/// </summary>
/// <returns></returns>
public System.Collections.IList Query()
{
try
{
session = NHibernateHelper.GetCurrentSession();
ITransaction trans = session.BeginTransaction();
System.Collections.IList list = session.CreateQuery("select u from User as u").List();
trans.Commit();
return list;
}
catch (Exception ex)
{
throw ex;
}
finally
{
session.Close();
}
}