你的位置:首页 > ASP.net教程

[ASP.net教程]Nhibernate的第一个实例


第一个NhIbernate程序

 

1、目的:

a) 链接到oracle数据库

b) 增删改

c) 基本查询、sql查询

d) 视图查询

e) 使用存储过程

f) 多表查询、级联查询

g) 级联增删改

 

2、后续目的

a) 加载机制——立即加载or延迟加载

b) 并发控制

c) 缓存——一级缓存,二级缓存

 

   接下来我会一一完成上面的目的,以便对Hhibernate有更多的了解,写希望各位能多多的指正。

 

3、第一个项目

a) 下载

Nhibernate最新版本为4.0.1.GA,下载地址:http://nhforge.org/

 

下载内容如下图

 

 

其中  Configuration_Templates中放的是各个数据库连接的配置文件样本模板,基本上包含了主流的数据库

 

B) 创建项目

根据三层架构把项目分为三层:

第一层: Model层——主要存放数据实体与映射文件

第二层: DAL层——存放数据库的操作方法

第三层: Facade层——业务逻辑层,主要实现与页面的业务逻辑

第四层: View层——页面层,包含接口、web

第五层:Common层——公共类层,主要存储一些共有的操作类

 

由于分五层为个人习惯问题,有不习惯的园友可以分三层:去掉第三层与第五层。

        分布图如下

       

    

 

  C) 引用DLL文件 (这里介绍主要的几个引用,其他的话,可以根据我放出的实例来看)

         Model层: 需要引入Required_Bins 文件夹中的Iesi.Collections.dll,NHibernate.dll;

         DAL层 :  需要引入Required_Bins 文件夹中的Iesi.Collections.dll,NHibernate.dll和Model层;

         Facade层:需要引入Model层与DAL层;

         View层:  需要引入Required_Bins 文件夹中的Iesi.Collections.dll,NHibernate.dll,log4net.dll和Model层与Facade层;

   

        其实还有另一种方法可以添加引用,就是通过NuGet进行引用,这种方法我在这里就不介绍了。

 

     D) 创建数据库

        先在oracle数据库中创建一张表,如图

 

      该表没有任何外键关联,也没其他表的ID字段。

 

E)创建model层中的持久化类 及 映射文件

创建cat的类

 

创建cat的mapping对应的文件

 

 

基本文件位置如下

 

 

    F)修改配置文件

      因为连接的是oracle的数据库,所以在下载的文件Configuration_Templates文件夹中找到oracle的配置文件,如图  

     

  选择oracle.cfg.文件 放到View层下面 ,并且修改名字。默认的名字是hibernate.cfg.,且需要放在bin——debug文件夹下面。大多数情况我们会根据自身的习惯进行一些调整。比如我喜欢放在App_Data文件夹下。

   

 

    修改配置文件信息

        原始的配置文件信息

 

        我修改后的文件信息

 

    G)编写DAL方法与实例

 

首先  先写一个NhibernateHelper.cs文件

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6  7 using NHibernate; 8 using NHibernate.Linq; 9 using NHibernate.Criterion;10 11 namespace CommonClass12 {13  public class NHibernateHelper14   {15    /// <summary>16     /// Session工厂17     /// </summary>18     private readonly ISessionFactory SessionFactory;19     /// <summary>20     /// nhibernate.cfg.21     /// </summary>22     private string "App_Data/hibernate.cfg.";23     /// <summary>24     /// 构造函数25     /// </summary>26     public NHibernateHelper()27     {28       if (SessionFactory == null)29       {30         var cfg = new NHibernate.Cfg.Configuration().Configure(31        32         SessionFactory = cfg.BuildSessionFactory();33         34       }35     }36 37    public NHibernateHelper(string path)38     {39       if (SessionFactory == null)40       {41         var cfg = new NHibernate.Cfg.Configuration().Configure(path);42 43         SessionFactory = cfg.BuildSessionFactory();44       }45     }46 47     /// <summary>48     /// 获取一个Isession49     /// </summary>50     /// <returns></returns>51     public ISession GetSession()52     {53       return SessionFactory.OpenSession();54     }55     /// <summary>56     /// 关闭一个Isession57     /// </summary>58     /// <param name="session"></param>59     public void CloseSeeion(ISession session)60     {61       session.Close();62     }63 64     /// <summary>65     /// 关闭一个Isessionfactory66     /// </summary>67     public void CloseSessionFactory()68     {69       SessionFactory.Close();70     }71   }72 }

   再编写CATDAL.cs  用来操作数据库的方法

 

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using NHibernate;using NHibernate.Linq;using NHibernate.Criterion;using ModelEntityClass.Model;using CommonClass;namespace DALClass{  public class CATDAL  {    private NHibernateHelper HB_Helper = null;    public CATDAL()    {      HB_Helper = new NHibernateHelper();    }    /// <summary>    /// 添加    /// </summary>    /// <param name="entitys"></param>    /// <returns></returns>    public bool InsertAll(List<CAT> entitys)    {      bool flag = false;      ISession session = HB_Helper.GetSession();      using (ITransaction tt = session.BeginTransaction())      {        try        {          foreach (CAT entity in entitys)          {            session.Save(entity);          }          session.Flush();          tt.Commit();          flag = true;        }        catch (HibernateException ex)        {          tt.Rollback();        }      }      HB_Helper.CloseSeeion(session);      return flag;    }    /// <summary>    /// 根据ID进行查找    /// </summary>    /// <param name="id"></param>    /// <returns></returns>    public CAT Find(string id)    {      ISession session = HB_Helper.GetSession();      CAT cat = null;      using (ITransaction tt = session.BeginTransaction())      {        try        {          cat = session.Query<CAT>().Where(p => p.ID == id).FirstOrDefault();        }        catch (HibernateException ex)        {          tt.Rollback();        }      }      HB_Helper.CloseSeeion(session);      return cat;    }    /// <summary>    /// 查询所有    /// </summary>    /// <returns></returns>    public List<CAT> FindAll()    {      ISession session = HB_Helper.GetSession();      //ICriteria criteria = session.CreateCriteria(typeof(CAT));      List<CAT> catList = null;      using (ITransaction tt = session.BeginTransaction())      {        try        {          catList = session.Query<CAT>().ToList();        }        catch (HibernateException ex)        {          tt.Rollback();        }      }      HB_Helper.CloseSeeion(session);      return catList;    }    /// <summary>    /// 删除所有    /// </summary>    /// <param name="entitys"></param>    /// <returns></returns>    public bool DeleteAll(List<CAT> entitys)    {      bool flag = false;      ISession session = HB_Helper.GetSession();      using (ITransaction tt = session.BeginTransaction())      {        try        {          foreach (CAT entity in entitys)          {            session.Delete(entity);          }          session.Flush();          tt.Commit();          flag = true;        }        catch (HibernateException ex)        {          tt.Rollback();        }      }      HB_Helper.CloseSeeion(session);      return flag;    }    /// <summary>    /// 删除    /// </summary>    /// <param name="entity"></param>    /// <returns></returns>    public bool Delete(CAT entity)    {      bool flag = false;      ISession session = HB_Helper.GetSession();      using (ITransaction tt = session.BeginTransaction())      {        try        {          session.Delete(entity);          session.Flush();          tt.Commit();          flag = true;        }        catch (HibernateException ex)        {          tt.Rollback();        }      }      HB_Helper.CloseSeeion(session);      return flag;    }    /// <summary>    /// 保存和添加    /// </summary>    /// <param name="entity"></param>    /// <returns></returns>    public bool SaveAndUpdate(List<CAT> entitys)    {      bool flag = false;      ISession session = HB_Helper.GetSession();      using (ITransaction tt = session.BeginTransaction())      {        try        {          foreach (CAT entity in entitys)          {            session.SaveOrUpdate(entity);          }          session.Flush();          tt.Commit();          flag = true;        }        catch (HibernateException ex)        {          tt.Rollback();        }      }      HB_Helper.CloseSeeion(session);      return flag;    }  }}

View Code

 

   接下来编辑业务逻辑层的类,由于它是对应ConsoleApplication1项目的这个业务,我把他命名成ConsoleFacade(里面只有一个方法,后面可以根据需要进行添加)

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using ModelEntityClass.Model;using DALClass;namespace FacadeClass{  public class ConsoleFacade  {    public bool InsertAll(List<CAT> entitys)    {      CATDAL dal = new CATDAL();      return dal.InsertAll(entitys);    }  }}

View Code

   现在我们进行测试

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using ModelEntityClass.Model;using FacadeClass;namespace ConsoleApplication1{  class Program  {    static void Main(string[] args)    {      CAT cat = new CAT();      cat.ID = Guid.NewGuid().ToString();      cat.NAME = "芝麻";      cat.SHORTNAME = "小婊砸";      cat.CREATDATA = DateTime.Now;      cat.ADDRESS = "北京市不知道什么的地方";      cat.AGE = 2;      cat.CODE = "M0001";      List<CAT> InsertList = new List<CAT> ();      InsertList.Add(cat);      ConsoleFacade facade = new ConsoleFacade();      if( facade.InsertAll(InsertList))      {        Console.WriteLine("添加成功");      }else      {        Console.WriteLine("添加失败");      }      Console.ReadKey();    }  }}

View Code

   测试页面如下

 

这样我们一个简单的Nhibernate实例就完成了。

 

 项目实例下载