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