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); } } }
本文由用戶 Blake36Q 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!