NHibernate.Driv">
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx

C#用NHibernate实现CRUD

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8" ?>  <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >   <session-factory>    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>    <property name="connection.connection_string">     Data Source=zhou;Initial Catalog=AspNetStudy;User ID=sa;Password=jerry;    </property>    <property name="adonet.batch_size">10</property>    <property name="show_sql">true</property>    <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>    <property name="use_outer_join">true</property>    <property name="command_timeout">10</property>    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>    <property name="proxyfactory.factory_class">     NHibernate.ByteCode.Castle.ProxyFactoryFactory,     NHibernate.ByteCode.Castle    </property>    <mapping assembly="NHibernateDemo"/>   </session-factory>  </hibernate-configuration>

UserInfo.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>  <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"    assembly="NHibernateDemo" namespace="NHibernateDemo">   <class name="UserInfo">    <id name="UserId" column="UserId">     <generator class="native"/>    </id>    <property name="UserName"/>    <property name="RealName"/>    <property name="Age"/>    <property name="Sex"/>    <property name="Mobile"/>    <property name="Phone"/>    <property name="Email"/>   </class>  </hibernate-mapping>

UserInfo.cs

using System;  using System.Collections.Generic;  using System.Text;    namespace NHibernateDemo  {      /// <summary>      /// 数据库中UserInfo表的持久化类      /// 作者:周公      /// 博客地址:http://blog.csdn.net/zhoufoxcn      /// 日期:2010-03-19      /// </summary>      public class UserInfo      {          public virtual int UserId { get; set; }          public virtual string UserName { get; set; }          public virtual string RealName { get; set; }          public virtual int Age { get; set; }          public virtual bool Sex { get; set; }          public virtual string Mobile { get; set; }          public virtual string Phone { get; set; }          public virtual string Email { get; set; }      }  }

NHibernateCRUD.cs

using System;  using System.Collections.Generic;  using System.Text;  using Iesi.Collections;  using NHibernate;  using NHibernate.Cfg;    namespace NHibernateDemo  {      /// <summary>      /// 说明:这个类是为了演示NHibernate中的CRUD的用法      /// 作者:周公(周金桥)      /// 日期:2010-03-07      /// </summary>      public class NHibernateCRUD      {          private ISessionFactory sessionFactory;          public NHibernateCRUD()          {              sessionFactory = new Configuration().Configure().BuildSessionFactory();          }            public ISession GetSession()          {              return sessionFactory.OpenSession();          }          /// <summary>          /// 统计用户总数          /// </summary>          /// <returns></returns>          public int Count()          {              #region 方法一              //ISession session = GetSession();              //ISQLQuery query = session.CreateSQLQuery("select count(1) from UserInfo");              //int count = query.List<int>()[0];              //session.Close();              //return count;              #endregion                #region 方法二              ISession session = GetSession();              IQuery query = session.CreateQuery("select count(c.UserId) from UserInfo c");              //注意:不能对于count函数不能使用query.List<int>(),因为默认返回的数值类型是long              //否则会抛出GenericADOException,异常描述是:Could not execute query[SQL: SQL not available]              //InnerException: System.ArgumentException,InnerException描述是:"值“*”不是“System.Int32”类型,不能在此泛型集合中使用。\r\n参数名: value              int count =(int)(query.List<long>()[0]);              session.Close();              return count;              #endregion          }          /// <summary>          /// 创建用户          /// </summary>          /// <param name="info">用户实体</param>          /// <returns></returns>          public int Create(UserInfo info)          {              ISession session = GetSession();              int newId=(int)(session.Save(info));              session.Flush();              session.Close();              return newId;          }          /// <summary>          /// 读取用户信息          /// </summary>          /// <param name="userId">用户编号</param>          /// <returns></returns>          public UserInfo Read(int userId)          {              ISession session = GetSession();              UserInfo info=session.Get<UserInfo>(userId);              session.Close();              return info;          }          /// <summary>          /// 更新用户信息          /// </summary>          /// <param name="info">用户实体</param>          /// <returns></returns>          public void Update(UserInfo info)          {              ISession session = GetSession();              session.Update(info);              session.Flush();              session.Close();          }          /// <summary>          /// 删除用户          /// </summary>          /// <param name="userId">用户编号</param>          /// <returns></returns>          public void Delete(int userId)          {              ISession session = GetSession();              //在NHibernate中支持直接使用参数值、":"+参数名、?(类似于在Access中使用参数化SQL语句的方式,给参数赋值要按照参数出现的顺序来)等几种方式              IQuery query = session.CreateQuery("delete from UserInfo where UserId=:UserId");              //如果采用":"+参数名方式使用参数,那么给参数赋值时不需要在参数名前加":"号,如query.SetInt32(":UserId", userId);就会报错              query.SetInt32("UserId", userId);              int affectedRows = query.ExecuteUpdate();              session.Close();              //return affectedRows;          }            /// <summary>          /// 删除用户          /// </summary>          /// <param name="userId">用户实体</param>          /// <returns></returns>          public void Delete(UserInfo info)          {              ISession session = GetSession();              session.Delete(info);              session.Flush();              session.Close();          }            /// <summary>          /// 获取用户表中编号最大的用户          /// </summary>          /// <returns></returns>          public int GetMaxUserId()          {              ISession session = GetSession();              IQuery query=session.CreateQuery("select max(UserId) from UserInfo");              int userId=query.List<int>()[0];              session.Close();              return userId;          }      }  }

单元测试 NHibernateTest.cs

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  using NUnit.Framework;  using NHibernateDemo;    namespace NUnitTest  {      [TestFixture]      public class NHibernateTest      {          private NHibernateCRUD instance = null;          [SetUp]          public void Initialize()          {              instance = new NHibernateCRUD();          }          [Test]          /// <summary>          /// 统计用户总数          /// </summary>          /// <returns></returns>          public void Count()          {              Assert.Greater(instance.Count(), 0);          }          [Test]          /// <summary>          /// 创建用户          /// </summary>          /// <param name="info">用户实体</param>          /// <returns></returns>          public void Create()          {              UserInfo info = new UserInfo()              {                  Age = 12,                  Email = "zzz@ccav.com",                  Mobile = "13812345678",                  Phone = "01012345678",                  RealName = "测试" + DateTime.Now.Millisecond.ToString(),                  Sex = true,                  UserName = "zhoufoxcn" + DateTime.Now.Millisecond.ToString()              };              instance.Create(info);          }          [Test]          /// <summary>          /// 读取用户信息          /// </summary>          /// <param name="userId">用户编号</param>          /// <returns></returns>          public void Read()          {              UserInfo info = instance.Read(1);              Assert.NotNull(info);          }          [Test]          /// <summary>          /// 更新用户信息          /// </summary>          /// <param name="info">用户实体</param>          /// <returns></returns>          public void Update()          {              UserInfo info = instance.Read(1);              info.RealName = "测试" + DateTime.Now.Millisecond.ToString();              instance.Update(info);          }          [Test]          /// <summary>          /// 删除用户          /// </summary>          /// <param name="userId">用户编号</param>          /// <returns></returns>          public void DeleteByID()          {              int userId = instance.GetMaxUserId();              instance.Delete(userId);          }            [Test]          /// <summary>          /// 删除用户          /// </summary>          /// <param name="userId">用户实体</param>          /// <returns></returns>          public void Delete()          {              int userId = instance.GetMaxUserId();              UserInfo info = instance.Read(userId);              Console.WriteLine("MaxUserId=" + userId);              instance.Delete(info);          }      }  }