商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
信箱 E杂志
您的位置:首页 > 技术频道 > 正文

Nhibernate学习入门

作者:jillzhang  2007-03-22

6).添加类文件:User.cs,添加代码:
using System; using System.Collections.Generic; using System.Text; namespace NhibernateSample1 { public class User { private int _id; private string _name; private string _pwd; /**//// <summary> /// 编号 /// </summary> public virtual int Id { get { return _id; } set { _id = value; } } /**//// <summary> /// 名称 /// </summary> public virtual string Name { get { return _name; } set { _name = value; } } /**//// <summary> /// 密码 /// </summary> public virtual string Pwd { get { return _pwd; } set { _pwd = value; } } } }

 


6).编写User类的映射配置文件:User.hbm.xml

<?xml version="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>


注意:该映射文件的属性中的生成操作必须为:嵌入的资源.

7).编写管理ISession对象的辅助类: NHibernateHelper.cs,代码为:

using System; using System.Web; using NHibernate; using NHibernate.Cfg; namespace NhibernateSample1 { public sealed class NHibernateHelper { private static readonly ISessionFactory sessionFactory; static NHibernateHelper() { sessionFactory = new Configuration().Configure(@"E:\my project\nhibernate study\simle 1\NHibernateStudy1\NhibernateSample1\hibernate.cfg.xml").BuildSessionFactory(); } public static ISession GetCurrentSession() { ISession currentSession = sessionFactory.OpenSession(); return currentSession; } public static void CloseSessionFactory() { 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 { public class UserFixure { private ISession session; public UserFixure() { } /**//// <summary> /// 创建表 /// </summary> public bool ExportTable() { try { Configuration cfg = new Configuration().Configure(@"E:\my project\nhibernate study\simle 1\NHibernateStudy1\NhibernateSample1\hibernate.cfg.xml"); session = NHibernateHelper.GetCurrentSession(); ITransaction transaction = session.BeginTransaction(); new SchemaExport(cfg).Create(true, true); transaction.Commit(); return true; } catch(Exception ex) { throw ex; } finally { session.Close(); } } /**//// <summary> /// 添加 /// </summary> public int Add() { try { User u = new User(); u.Name = Guid.NewGuid().ToString(); u.Pwd = "124"; session = NHibernateHelper.GetCurrentSession(); ITransaction transaction = session.BeginTransaction(); session.Save(u); transaction.Commit(); return u.Id; } catch (Exception ex) { throw ex; } finally { session.Close(); } } /**//// <summary> /// 更新 /// </summary> /// <param name="uid"></param> public bool Update(int uid) { try { session = NHibernateHelper.GetCurrentSession(); ITransaction transaction = session.BeginTransaction(); User u = session.Load(typeof(User), uid) as User; if (u != null) { u.Name = "updatedName"; session.SaveOrUpdate(u); transaction.Commit(); u = session.Load(typeof(User), uid) as User; if (u.Name == "updatedName") { return true; } } return false; } catch (Exception ex) { throw ex; } finally { session.Close(); } } /**//// <summary> /// 删除 /// </summary> /// <param name="uid"></param> /// <returns></returns> public bool Delete(int uid) { try { session = NHibernateHelper.GetCurrentSession(); ITransaction transaction = session.BeginTransaction(); User u = session.Get(typeof(User), uid) as User; if (u != null) { session.Delete(u); transaction.Commit(); u = session.Get(typeof(User), uid) as User; if (u == null) { return true; } } return false; } catch (Exception ex) { throw ex; } finally { session.Close(); } } public System.Collections.IList Query() { try { session = NHibernateHelper.GetCurrentSession(); ITransaction transaction = session.BeginTransaction(); System.Collections.IList list= session.CreateQuery("select u from User as u").List(); transaction.Commit(); return list; } catch (Exception ex) { throw ex; } 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] public class UnitTest1 { public UnitTest1() { // // TODO: 在此处添加构造函数逻辑 // } 其他测试属性#region 其他测试属性 // // 您可以在编写测试时使用下列其他属性: // // 在运行类中的第一个测试之前使用 ClassInitialize 运行代码 // [ClassInitialize()] // public static void MyClassInitialize(TestContext testContext) { } // // 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码 // [ClassCleanup()] // public static void MyClassCleanup() { } // // 在运行每个测试之前使用 TestInitialize 运行代码 // [TestInitialize()] // public void MyTestInitialize() { } // // 在运行每个测试之后使用 TestCleanup 运行代码 // [TestCleanup()] // public void MyTestCleanup() { } // #endregion int uid; [TestMethod] public void TestMethod1() { UserFixure userFixure = new UserFixure(); Assert.IsTrue(userFixure.ExportTable()); } [TestMethod] public void TestMethod2() { UserFixure userFixure = new UserFixure(); uid = userFixure.Add(); Assert.IsTrue(uid>0); } [TestMethod] public void TestMethod3() { UserFixure userFixure = new UserFixure(); Assert.IsTrue(userFixure.Update(uid)); } [TestMethod] public void TestMethod4() { UserFixure userFixure = new UserFixure(); Assert.IsTrue(userFixure.Delete(uid)); } [TestMethod] public void TestMethod5() { UserFixure userFixure = new UserFixure(); Assert.IsTrue(userFixure.Query().Count>0); } } }


11)在菜单-测试-加载元数据文件 选择NHibernateStudy1.vsmdi,然后按顺序执行TestMethod1-TestMethod5,全部成功!

4.总结
  通过使用Nhibernate,基本上可以使开发人员不在接触繁琐的数据库表和数据库操作代码,您唯一需要关心的就是如何设计好类,让这些类满足您的业务需求。从扩展性来说Nhinernate具有非常好的扩展性。与代码生成比较,Nhibernate更改数据表结构对代码的影响要远远小于代码生成。

1 2
【内容导航】
第1页: 环境安装与配置 第2页: 具体代码
©版权所有。未经许可,不得转载。
[责任编辑:晓熊]