由于我平时喜欢尝试的事情马上,我也做了同样的时候开始NHibernate的了解,所以我启动了我的Visual Studio 2008并创建一个新的Web应用程序能够探索这个新的真棒技术。
我读(总是不那么彻底或许)的文档,还搜查了周围一些简单的例子,让我开始,和我的MySQL的风扇,我想我的第一个测试应用程序中使用它。不幸的是,我偶然发现了一些问题,因为我看到了和所有的文档样本中没有真正的状态使用NHibernate的版本,而不是哪个版本的MySQL一直试图在所有的例子,所以我花了一段时间马上获得一切都正常了。
由于这些问题,我决定写一个简短的文字,您可以如何使用NHibernate和MySQL,并专门为NHibernate的2.0.0.1001,MySQL的5.0.45,并使用MySQL ADO.Net驱动程序5.1.5.0。我不打算在这个文本所有详细,但其用意是给的例子,如何可以在最简单的方式完成。
我假设你熟悉,我在这个文本中使用的技术和名称,但如果你想获得一个更新,您可以阅读,并在这里下载最新版本:
,处理坚持平原。NET对象,并从一个关系数据库。{A3},一个流行的开源数据库引擎(现在拥有由Sun)。使用代码
要开始,我想一个新的清洁项目,在VS2008,所以我创建了一个新的ASP.NET Web应用程序新/ Project菜单项下选择"文件"菜单上,我创建一个新的应用程序从Visual C#/ Web部分,让我们的呼叫它WebApp1。
WebApp1只包含一个默认的页面,Default.aspx的我添加一个Label控件Label1的,名为TextBox1的TextBox,和两个按钮。我的意图来检索一个从数据库中通过NHibernate的单一对象时,页面加载和显示的该对象的Label控件的文本属性的ID和,在TextBox的文本属性对象的文本值之一,和两个按钮用于更新和删除。NHibernate的
对于NHibernate的工作,我不得不添加一些引用到我的项目,我发现,它不仅是必要的,但也以下NHibernate.dll的:Castle.CoreCastle.DynamicProxy2Iesi.Collectionslog4net的Lucene.NetRhino.Mocks
据我看了看文档和样本,你可以配置NHibernate的主要有三种方式:通过web.config中,代码,或由一个单独的配置文件只是为NHibernate的名为hibernate.cfg.xml中。我选择使用最后一种方法,因为它似乎很高兴有这样的其他配置的东西分开,让我们走吧,采取的配置文件。
hibernate.cfg.xml文件中包含了几行,很容易理解,在这里,他们中的一些解释。我开始用的文件,看起来像这样:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<!-- an ISessionFactory instance -->
<session-factory>
<!-- properties -->
<property name="connection.provider">
NHibernate.Connection.DriverConnectionProvider
</property>
<property name="connection.driver_class">
NHibernate.Driver.MySqlDataDriver
</property>
<property name="connection.connection_string">
Server=localhost;Database=test;User ID=test;Password=test;
</property>
<property name="dialect">
NHibernate.Dialect.MySQL5Dialect
</property>
<!-- mapping files -->
<mapping resource="WebApp1.Site.hbm.xml" assembly="WebApp1" />
</session-factory>
</hibernate-configuration> connection.provider套应通过NHibernate的连接提供用于连接到数据库。connection.driver_class套哪个驱动程序应使用在这种情况下,当使用MySQL,MySqlDataDriver是一个合乎逻辑的选择connection.connection_string是数据库的连接字符串。方言国家NHibernate的类的名称,使某些特定的平台相关的特性,在这种情况下,因为我使用的是MySQL 5,显而易见的选择是MySQL5Dialect
映射的一部分配置文件告诉NHibernate映射文件的使用对象/关系映射,我将介绍在这篇文章中,晚了一点。持久化类
NHibernate的可以使用普通班时,坚持在关系数据库中的对象,并使用一个持久化类的属性连接到关系数据库中的表列的映射技术。对于我的简单的例子,我创建一个简单的类名为Site,那个类的代码如下:
Site.cs包含两个属性,我将展示后,我使用的数据库中的表列THT关联。 NHibernate是不是真的限制只使用属性类型,所有。NET类型和原始类型可以被映射,包括System.Collections命名空间中的类,但在这个简单的例子,我只使用int和string。
ID属性是很重要的,因为这将与数据库中的表的主键,即使它不是强制使用NHibernate的(它可以处理内部的标识符),感觉对我来说是很自然的建筑方法。
正如你可以看到,所有的公共属性声明为虚,这是因为NHibernate利用一些运行时的改进,否则将无法正常工作根据文档,而且它也建议您提供一个默认的构造函数类。映射
为了能使用本网站类,有必要创建一个映射文件包含元数据,NHibernate的使用对象/关系映射,即,连接类声明中,列的属性,并在键数据库表。映射文件中,被命名为Site.hbm.xml,宣布为在我的例子:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="WebApp1.Site, WebApp1" table="site">
<id name="Id" column="ID" type="int">
<generator class="native"></generator>
</id>
<property name="Name" column="name"
type="String"></property>
</class>
</hibernate-mapping>
映射文件与数据库表被声明为:
CREATE TABLE 'site' (
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
映射文件中包含的一组节点和他们的解释是短版:Hibernate的映射国家,这是一个Hibernate映射文件和xmlns属性声明,应使用的XML命名空间类状态持久化类的映射,这是连接到:name属性必须注明完全合格的。之类的名称,还必须包括程序集的名称表的属性名在数据库中的表的名称id是节点描述数据库中的表的主键列name属性告诉NHibernate持久化类的属性是用来在数据库表中的列是主键列属性告诉type属性告诉NHibernate的数据库类型,这在大多数情况下,应自动检索,但我发现这是一个问题,因此指定的类型发电机是一个ID节点所需的子元素,和类的属性状态,这应该用来生成持久化类的实例的唯一标识符。NET类,这个类可能是一个应用程序的具体实施,也可以NHibernate的规定,在我的情况是原生类,取决于底层数据库的能力,并为MySQL,使用自动递增功能的标识列的能力,内置的实现财产是一个或多个元素,描述持久化类的属性对应到数据库中的表,这在我的情况,只有一列由这样的列的相应的映射name属性告诉使用类的属性列属性对应数据库中的列名type属性告诉NHibernate的数据库列的类型,这在大多数情况下,应自动检测,但如前所述,可以是一些滋扰
这个映射文件添加到我的项目的根,我发现,生成XML文件的行动应设置为quot;嵌入式Resourcequot,这使得它的NHibernate在运行时解析,从而简化了编码使用的映射功能时所需的。编码
确定,让我们回到的编码现在我们已经配置和应用程序的地方的映射部分。正如前面所描述的,我只有一个页面,其中包含一个Label控件,我的意思是能够使用NHibernate的对象/关系映射做到这一点,从数据库中检索单个值。所以,让我们在Default.aspx.cs代码部分。
在Page_Load中,我有以下代码检索从数据库中的站点名称列表:
System.Collections.IList siteList;
ISessionFactory factory =
new NHibernate.Cfg.Configuration().Configure().BuildSessionFactory();
ICriteria sc = session.CreateCriteria(typeof(Site));
siteList = sc.List();
session.Close();
Label1.Text = ((Site)siteList[0]).Id.ToString();
TextBox1.Text = ((Site)siteList[0]).Name
第一行是我的一个普通的IList将包含站点对象名单,我相信从NHibernate的声明。
ISessionFactory,根据NHibernate的文档,一个线程缓存单个数据库映射关系经过编译后的安全,而当我们已被嵌入的资源映射文件的情况下,这是唯一的代码,需要获得这样的工厂。
接下来的部分使用ISession实例,这是作为一个短命的代表之间的应用程序和持久性存储,即数据库的谈话对象,真正封装了一个ADO.NET连接。为了得到一个ISession实例,你问的ISessionFactory实例打开并返回通过OpenSession()函数的对象。
接下来的部分使用ICriteria的实例,这实际上是一个由NHibernate的查询API,它使我们能够通过使用更多的面向对象的方法建立查询,动态和代表对一个特定的持久化类的查询。在我的例子中,我使用一个ICriteria检索NHibernate的网站实例列表,这是实现一个会话对象的标准实例,并且还告诉会议,我们希望得到哪种类型的对象回来。
最简单的方式来获得一个对象数组是使用List()函数从标准的实例,它实际上返回一个IList实例,其中包含我们的标准中定义的特定的持久化类的实例数组。
释放,我们所使用的资源,我调用Close()会话对象的工厂对象。
,最后,我以为我已经得到了一定的成效,从数据库和检索站点对象从列表中第一次出现,并得到ID和Name属性,目前,在我的Label1.Text和TextBox1.Text属性。
因为我也想更新Name属性,我增加了以下事件处理程序,我创建的第一个按钮:
protected void Button1_Click(object sender, EventArgs e)
ISessionFactory factory =
new NHibernate.Cfg.Configuration().Configure().BuildSessionFactory();
Site s;
using (ISession session = factory.OpenSession())
s = (Site)session.Load(typeof(Site), int.Parse(Label1.Text));
s.Name = TextBox1.Text;
session.SaveOrUpdate(s);
session.Flush();
session.Close();
这段代码实现的是,当点击Button1的是,我像以前那样,通过使用创建一个ISessionFactory,我创建一个ISession的会议,然后我用检索与从检索到的ID Label1.Text相应的网站对象物业,使用Load方法从会话实例,指示会议检索站点对象。我再更新用新的名称检索对象,然后问题SaveOrUpdate的命令,指示NHibrnate,信息已经更新。要坚持对数据库进行更改,必须使用FLUSH命令,否则的变化不会传播回数据库(不完全属实,如果你使用的交易,但在另一篇文章)。
第二个按钮,Button2的,是用来删除指定的对象,并连接到更新的一部分,这是非常类似的事件:
protected void Button2_Click(object sender, EventArgs e)
ISessionFactory factory =
new NHibernate.Cfg.Configuration().Configure().BuildSessionFactory();
using (ISession session = factory.OpenSession())
s = (Site)session.Load(typeof(Site), int.Parse(Label1.Text));
session.Delete(s);
session.Flush();
session.Close();
更新代码一样,第一步是检索,我们感兴趣的对象,然后通过使用会话实例,调用该对象上的"删除"命令,最后,刷新更改回的数据存储。摘要
这个简短的文章介绍如何使用NHibernate和MySQL的介绍,从一个更面向对象的方式的关系型数据库的信息的一个例子,它在许多方面是不完整的,我已经离开了异常处理和多,但它如何将这些技术可用于也许某人呼吁研究这更因为它是一个非常有趣的方法,简化了数据库连接,我们几乎总是在我们的应用程序使用。兴趣点
这块代码和配置工作期间,我偶然发现的一些问题几乎总是与产品的版本和兼容性问题,在大多数情况下也被连接到更新的文档,有关开源开发项目的问题。历史2008-05-15:第一个版本。2008-10-16:更新与更新文本和删除功能。
--转自