Kaisir最近在做的小项目中一直有在使用大名鼎鼎的Hibernate的.Net版本–NHibernate,百度了下下,发现可以参考的例子非常少,就把自己在应用过程中的例子拿出来,供大家参考。也方便自己下次配置时不用再到处找资料了。这篇文章不深究Nhibernate的实现,想要了解如何实现的童鞋,可以继续Google下~~不过也不排除等空闲的时候自己阅读下源代码,来篇NHibernate源码分析 哇哈哈~
一般的框架集都是通过配置文件来进行配置的,NHibernate也不例外,且NHibernate的配置分为两部分,基础配置及数据实体配置。
(一)基础配置
对于Nhibernate来说,基础配置主要体现在对web.config的配置。在其中,我们定义了他要连接数据库的基本信息,以及以什么形式连接数据库,此外,还可以在这里增加调试(log4net)信息的输出。当然,首先要做的,还有在<configSections>段增加NHibernate程序集本身的信息。
[codesyntax lang=”xml” blockstate=”expanded”]
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.2.0.3001,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
[/codesyntax]
[codesyntax lang=”xml”]
<nhibernate> <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/> <add key="hibernate.dialect" value="NHibernate.Dialect.GenericDialect"/> <add key="hibernate.connection.driver_class" value="NHibernate.Driver.OleDbDriver"/> <add key="hibernate.connection.connection_string" value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|djshfk34234.mdb"/> </nhibernate>
[/codesyntax]
(二)实体配置
实体(Model)这个概念应该不单单是Nhibernate中存在的概念,凡是涉及到以整个对象进行操作的组件,都会有这个概念,且实体是程序中对数据结构最底层的抽象之一。这里,我们首先需要将实体设计的类写出:
[codesyntax lang="csharp"]public class Category { private string _c_ID=Guid.NewGuid().ToString(); private string _c_Name=""; private string _c_Order="0"; private string _c_Intro=""; private string _c_Url=""; private DateTime _c_Time=DateTime.Now; #region Constructors public Category() { } #endregion #region Properties public virtual string C_ID { get { return _c_ID; } set { _c_ID = value; } } public virtual string C_Name { get { return _c_Name; } set { _c_Name = value; } } public virtual string C_Order { get { return _c_Order; } set { _c_Order = value; } } public virtual string C_Intro { get { return _c_Intro; } set { _c_Intro = value; } } public virtual string C_Url { get { return _c_Url; } set { _c_Url = value; } } public virtual DateTime C_Time { get { return _c_Time; } set { _c_Time = value; } } #endregion } }[/codesyntax]
在写出实体类之后,我们便可以依照实体中具体字段与数据库字段的对应关系,写出相应的配置文件,注意,这里配置文件必须以实体名.hbm.xml的形式命名。且这个配置文件的属性,必须更改为嵌入。
[codesyntax lang=”xml”]<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <class name="Model.Category,Model" table="c_category"> <id name="C_ID" column="C_ID" type="String"> <generator class="assigned"/> </id> <property name="C_Name" column="C_Name" type="String"/> <property name="C_Order" column="C_Order" type="String"/> <property name="C_Intro" column="C_Intro" type="String"/> <property name="C_Url" column="C_Url" type="String"/> <property name="C_Time" column="C_Time" type="DateTime"/> </class> </hibernate-mapping>[/codesyntax]
经过了以上简单的配置,我们的NHibernate应该已经可以正常工作了,下面要做的只是通过SessionFactory的OpenSession方法创建Session对象,并使用BeginTransaction,创建事务,接下来要做的只是把用填充好的实体带到Session的save()等CRUD方法中,并使用Transaction的commit进行提交,就Ok鸟~~[codesyntax lang="csharp"]public void AddEntity(Object entity) { ISession session = SessionFactory.OpenSession(_AssemblyName); ITransaction transaction = session.BeginTransaction(); try { session.Save(entity); transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); throw ex; } finally { session.Close(); } } public static ISession OpenSession(string AssemblyName) { if (sessions==null) { lock (padlock) { if (sessions==null) { BuildSessionFactory(AssemblyName); } } } return sessions.OpenSession(); } private static void BuildSessionFactory(string AssemblyName) { cfg = new Configuration(); cfg.AddAssembly(AssemblyName); sessions = cfg.BuildSessionFactory(); } }[/codesyntax]
NHibernate是从Java的Hibernate移植到.Net上的,所以(应该)有些用法可以参考Hibernate,Hibernate的资料相对多一些.
@雨碎江南, 确实是这样子的~~现在我能找到的唯一一本说NHibernate的书只有NHibernate In Action
不明真相!我完全打酱油的!
什么js 网络技术 php java 生活日志我一个不懂!
我只是想对博主问一声!您好!辛苦了
过来学习一下,听说你有自己的团队啦!
@Laoji, 在之前的学校我跟一个好朋友合作做项目,一直合作都很愉快~~不知道你擅长哪方面的技术,是否熟悉C#,JavaScript,Css等,如果答案是肯定的话,欢迎你加入我们的团队哈~
可以说都会吧!不过做的不算很好,呵呵……我现在在山东理工,很想认识你一下!如果可以的话,真诚的加入你们团队!
@Laoji, 你用Gtalk么?用的话可以加我Gtalk,Kaisir.Wang@Gmail.Com
Hibernate 的确 比较优秀啊 在java 下用的很多 !