Nhibernate学习之起步篇-1

本文介绍如何使用NHibernate框架进行数据库操作,包括环境搭建、配置文件编写、映射文件设置及基本的CRUD操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.学习目的
学习Nhibernate基础知识。掌握Nhibernate的配置方法,实现对单表的简单操作,如:创建表,查询,添加,删除,修改。
2.开发环境+前期准备
开发环境: windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition
前期准备: Nhibernate框架,我用的目前最新版NHibernate-1.2.0.CR1, 下载地址: http://downloads.sourceforge.net/nhibernate/NHibernate-1.2.0.CR1.msi?modtime=1172161735&big_mirror=0
3.开发步骤:
1).双击下载下来的NHibernate-1.2.0.CR1.msi,将其安装到某个目录,我的目录为: E:/download project/orm/nhibernate.,打开该目录,即可以看到bin,doc,src三个子目录,分别为Realse好的dll或者exe目录,文档说明目录,和源程序目录.
2).打开visual studio 2005,创建类库项目NhibernateSample1
3).在解决方案管理其中,右键点击引用-添加引用,在选项卡种选择浏览,设定查找范围为:E:/download project/orm/nhibernate/bin,添加对Nhibernate.dll,log4net.dll, Iesi.Collections, HashCodeProvider四个dll的引用.
4).打开SQL Server Management Studio,创建数据库nhibernate。
5).在解决方案管理器中添加hibernate.cfg.xml文件。将下面代码粘贴到此文件:
<? xmlversion="1.0"encoding="utf-8" ?>
< hibernate-configuration xmlns ="urn:nhibernate-configuration-2.2" >
< session-factory name ="NHibernate.Test" >
<!-- properties -->
< property name ="connection.provider" > NHibernate.Connection.DriverConnectionProvider </ property >
< property name ="connection.driver_class" > NHibernate.Driver.SqlClientDriver </ property >
< property name ="connection.connection_string" > Server=127.0.0.1;initialcatalog=nhibernate;uid=sa;pwd=123; </ property >
< property name ="show_sql" > false </ property >
< property name ="dialect" > NHibernate.Dialect.MsSql2005Dialect </ property >
< property name ="use_outer_join" > true </ property >
<!-- mappingfiles -->
< mapping assembly ="NhibernateSample1" />
</ session-factory >
</ hibernate-configuration >

该文件是Nhibernate的配置文件,其中connection.connection_string为数据库连接字符串,Dialect项因为我用的是SQL2005,所以为:MsSql2005Dialect注意:<mapping assembly=”NhibernateSample1”/>表示映射NhibernateSample1程序集下的所有类,所以以后不要需要Configuration.AddClass(..)了;

6).添加类文件:User.cs,添加代码:
using System;
using System.Collections.Generic;
using System.Text;

namespace NhibernateSample1
{
publicclassUser
{
privateint_id;
privatestring_name;
privatestring_pwd;
/**////<summary>
///编号
///</summary>

publicvirtualintId
{
get
{
return_id;
}

set
{
_id
=value;
}

}


/**////<summary>
///名称
///</summary>

publicvirtualstringName
{
get
{
return_name;
}

set
{
_name
=value;
}

}


/**////<summary>
///密码
///</summary>

publicvirtualstringPwd
{
get
{
return_pwd;
}

set
{
_pwd
=value;
}

}

}

}

6). 编写 User 类的映射配置文件 :User.hbm.xml
7).编写管理ISession对象的辅助类: NHibernateHelper.cs,代码为:
<? xmlversion="1.0"encoding="utf-8" ?>
< hibernate-mapping xmlns ="urn:nhibernate-mapping-2.2" >
< class name ="NhibernateSample1.User,NhibernateSample1" table ="Users" lazy ="false" >
< id name ="Id" column ="Id" unsaved-value ="0" >
< generator class ="native" />
</ id >
< property name ="Name" column ="Name" type ="string" length ="64" not-null ="true" unique ="true" ></ property >
< property name ="Pwd" column ="Pwd" type ="string" length ="64" not-null ="true" ></ property >
</ class >
</ hibernate-mapping >
注意:该映射文件的属性中的生成操作必须为:嵌入的资源.

using System;
using System.Web;
using NHibernate;
using NHibernate.Cfg;

namespace NhibernateSample1
{
publicsealedclassNHibernateHelper
{
privatestaticreadonlyISessionFactorysessionFactory;

staticNHibernateHelper()
{
sessionFactory
=newConfiguration().Configure(@"E:/myproject/nhibernatestudy/simle1/NHibernateStudy1/NhibernateSample1/hibernate.cfg.xml").BuildSessionFactory();
}


publicstaticISessionGetCurrentSession()
{
ISessioncurrentSession
=sessionFactory.OpenSession();
returncurrentSession;
}


publicstaticvoidCloseSessionFactory()
{
if(sessionFactory!=null)
{
sessionFactory.Close();
}

}

}

}

:因为我用的是单元测试,所以这里的配置文件路径写成固定的了。如果换成windows或者Web 程序,可以直接去掉该路径。

8) 编写测试CRUD类 :UserFixue
using System;
using System.Collections.Generic;
using System.Text;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Tool.hbm2ddl;
namespace NhibernateSample1
{
publicclassUserFixure
{
privateISessionsession;
publicUserFixure()
{

}

/**////<summary>
///创建表
///</summary>

publicboolExportTable()
{
try
{
Configurationcfg
=newConfiguration().Configure(@"E:/myproject/nhibernatestudy/simle1/NHibernateStudy1/NhibernateSample1/hibernate.cfg.xml");
session
=NHibernateHelper.GetCurrentSession();
ITransactiontransaction
=session.BeginTransaction();
newSchemaExport(cfg).Create(true,true);
transaction.Commit();
returntrue;
}

catch(Exceptionex)
{
throwex;
}

finally
{
session.Close();
}

}

/**////<summary>
///添加
///</summary>

publicintAdd()
{
try
{
Useru
=newUser();
u.Name
=Guid.NewGuid().ToString();
u.Pwd
="124";
session
=NHibernateHelper.GetCurrentSession();
ITransactiontransaction
=session.BeginTransaction();
session.Save(u);
transaction.Commit();
returnu.Id;
}

catch(Exceptionex)
{
throwex;
}

finally
{
session.Close();
}

}

/**////<summary>
///更新
///</summary>
///<paramname="uid"></param>

publicboolUpdate(intuid)
{
try
{
session
=NHibernateHelper.GetCurrentSession();
ITransactiontransaction
=session.BeginTransaction();
Useru
=session.Load(typeof(User),uid)asUser;
if(u!=null)
{
u.Name
="updatedName";
session.SaveOrUpdate(u);
transaction.Commit();
u
=session.Load(typeof(User),uid)asUser;
if(u.Name=="updatedName")
{
returntrue;
}

}

returnfalse;
}

catch(Exceptionex)
{
throwex;
}

finally
{
session.Close();
}

}

/**////<summary>
///删除
///</summary>
///<paramname="uid"></param>
///<returns></returns>

publicboolDelete(intuid)
{
try
{
session
=NHibernateHelper.GetCurrentSession();
ITransactiontransaction
=session.BeginTransaction();
Useru
=session.Get(typeof(User),uid)asUser;
if(u!=null)
{
session.Delete(u);
transaction.Commit();
u
=session.Get(typeof(User),uid)asUser;
if(u==null)
{
returntrue;
}

}

returnfalse;
}

catch(Exceptionex)
{
throwex;
}

finally
{
session.Close();
}

}

publicSystem.Collections.IListQuery()
{
try
{
session
=NHibernateHelper.GetCurrentSession();
ITransactiontransaction
=session.BeginTransaction();
System.Collections.IListlist
=session.CreateQuery("selectufromUserasu").List();
transaction.Commit();
returnlist;
}

catch(Exceptionex)
{
throwex;
}

finally
{
session.Close();
}

}

}

}


9)创建新单元测试项目: TestProject1,添加NhibernateSample1的引用
10)创建单元测试类: UnitTest1.cs,并输入如下代码 :
using System;
using System.Text;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NhibernateSample1;

namespace TestProject1
{
/**////<summary>
///UnitTest1的摘要说明
///</summary>

[TestClass]
publicclassUnitTest1
{
publicUnitTest1()
{
//
//TODO:在此处添加构造函数逻辑
//
}


其他测试属性#region其他测试属性
//
//您可以在编写测试时使用下列其他属性:
//
//在运行类中的第一个测试之前使用ClassInitialize运行代码
//[ClassInitialize()]
//publicstaticvoidMyClassInitialize(TestContexttestContext){}
//
//在类中的所有测试都已运行之后使用ClassCleanup运行代码
//[ClassCleanup()]
//publicstaticvoidMyClassCleanup(){}
//
//在运行每个测试之前使用TestInitialize运行代码
//[TestInitialize()]
//publicvoidMyTestInitialize(){}
//
//在运行每个测试之后使用TestCleanup运行代码
//[TestCleanup()]
//publicvoidMyTestCleanup(){}
//
#endregion


intuid;
[TestMethod]
publicvoidTestMethod1()
{
UserFixureuserFixure
=newUserFixure();
Assert.IsTrue(userFixure.ExportTable());
}

[TestMethod]
publicvoidTestMethod2()
{
UserFixureuserFixure
=newUserFixure();
uid
=userFixure.Add();
Assert.IsTrue(uid
>0);
}

[TestMethod]
publicvoidTestMethod3()
{
UserFixureuserFixure
=newUserFixure();
Assert.IsTrue(userFixure.Update(uid));
}

[TestMethod]
publicvoidTestMethod4()
{
UserFixureuserFixure
=newUserFixure();
Assert.IsTrue(userFixure.Delete(uid));
}

[TestMethod]
publicvoidTestMethod5()
{
UserFixureuserFixure
=newUserFixure();
Assert.IsTrue(userFixure.Query().Count
>0);
}

}

}


11)在菜单-测试-加载元数据文件 选择NHibernateStudy1.vsmdi,然后按顺序执行TestMethod1-TestMethod5,全部成功!
4.总结
通过使用Nhibernate,基本上可以使开发人员不在接触繁琐的数据库表和数据库操作代码,您唯一需要关心的就是如何设计好类,让这些类满足您的业务需求。从扩展性来说Nhinernate具有非常好的扩展性。与代码生成比较,Nhibernate更改数据表结构对代码的影响要远远小于代码生成。
如果您想下载Demo: /Files/jillzhang/simle.rar
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值