前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#用NHibernate实现CRUD

C#用NHibernate实现CRUD

原创
作者头像
用户8671053
修改2021-11-02 16:00:49
3700
修改2021-11-02 16:00:49
举报
文章被收录于专栏:码农的生活码农的生活

hibernate.cfg.xml

代码语言:javascript
复制
<?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

代码语言:javascript
复制
<?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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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);
        }
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档