65.9K
CodeProject 正在变化。 阅读更多。
Home

NHibernate 基础

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.73/5 (28投票s)

2011年7月11日

CPOL

3分钟阅读

viewsIcon

141977

downloadIcon

5336

NHibernate 入门,一个小应用程序,演示将对象保存到数据库以及从数据库加载对象。

Demo Application UI

引言

NHibernate 是一个针对 .NET 平台的对象关系映射 (ORM) 解决方案。它提供了一个框架,用于将面向对象的领域模型映射到传统的关系数据库。它的主要功能是将 .NET 类映射到数据库表,并将 CLR 数据类型映射到 SQL 数据类型。

正如本文的标题,我们只关注这个功能; 如何从数据库加载业务对象,以及如何将这些对象中的更改保存回数据库。

背景

演示应用程序以最简单的方式演示如何设置和使用 NHibernate。 该应用程序创建一个 Employee 对象并将其存储在 Employee 表中。 它还执行一些操作,例如检索和删除 Employee 对象等。 该应用程序使用 NHibernate 3.2.0、VS 2010 和 SQL Server 2008 创建。

Using the Code

数据库

在这里,我们首先要设置数据库。 使用 SQL Server Management Studio 创建一个可用于详细阐述的数据库。 如下所示,创建一个名为 NHibernateBasics 的新数据库。

Create New Database

然后添加一个名为 Employee 的表,其中包含两列:ID Name

Create New Table

ID 应为主键并用作标识。 不要忘记在属性中启用 标识规范

Set Table Properties

业务对象

数据库已准备好进行演示。 现在启动 Visual Studio 并创建一个名为 NHibernateBasics 的新 WindowsFormsApplication 项目。 添加一个名为 Employee.cs 的新类,并使用以下代码

namespace NHibernateBasics
{
    public class Employee
    {
        public virtual int ID { get; set; }

        public virtual string Name { get; set; }
    }
}

NHibernate 最强大的功能之一是它不需要业务类上的特殊接口。 这些对象不知道用于加载和保存它们的机制。 但是,它要求将属性声明为 virtual,以便它可以根据需要创建代理。

映射 XML 文件

在没有针对休眠的特定代码的情况下,有人应该引导从数据库到业务对象再返回的转换。 这可以通过映射 XML 文件或在类和属性上应用属性来实现。 在演示应用程序中,我们使用了映射文件来保持我们的业务对象类的整洁。

向项目中添加一个新的 XML 文件。 XML 文件将用作映射文件。 文件的名称必须是 Employee.hbm.xml。 类 <name>.cs 文件和映射 <name>.hbm.xml 文件应位于同一文件夹中,并且 <name> 应该相同。 将以下内容添加到文件中

 <?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
	namespace="NHibernateBasics" assembly="NHibernateBasics">
  <class name="Employee" table="Employee">
    <id name="ID" column="ID">
      <generator class="identity"/>
    </id>
    <property name="Name" column="Name"  />
  </class>
</hibernate-mapping>

在映射 XML 文件的属性中,将生成操作设置为 嵌入的资源

Set Mapping File Properties

配置

添加一个新的应用程序配置文件 (app.config)。 复制以下内容

 <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="hibernate-configuration" 
	type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
  </configSections>
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="connection.provider">
	NHibernate.Connection.DriverConnectionProvider</property>
      <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
      <property name="query.substitutions">hqlFunction=SQLFUNC</property>
      <property name="connection.driver_class">
	NHibernate.Driver.SqlClientDriver</property>
      <property name="connection.connection_string">
	Data Source=(Local)\SQL2008;Initial Catalog=NHibernateBasics;
	Integrated Security=True</property>
      <property name="show_sql">true</property>
      <mapping assembly="NHibernateBasics" />
    </session-factory>
  </hibernate-configuration>
</configuration>

调整 connection.connection_string 属性,使其适用于您的数据库。 设置 Catalog=<Database Name>; 这里是 NHibernateBasics。 设置 mapping assembly=<Class DLL Name>; 这里又是 NHibernateBasics

演示

现在我们几乎准备好进行演示了。 我们只需要访问业务类对象并在其上执行某些操作即可。

保存

using(mySession.BeginTransaction())
{
    // Insert two employees in Database
    mySession.Save(myInitialObjects[0]); 
    mySession.Save(myInitialObjects[1]); 
    mySession.Transaction.Commit(); 
} 

Load (加载)

using(mySession.BeginTransaction())
{
    // Create the criteria and load data
    ICriteria criteria = mySession.CreateCriteria<employee>();
    IList<employee> list = criteria.List<employee>();
    for (int i = 0; i < myFinalObjects.Length; i++)
    {
        myFinalObjects[i] = list[i];
        MessageBox.Show("ID: " + myFinalObjects[i].ID + " 
			Name: " + myFinalObjects[i].Name);
    }
    mySession.Transaction.Commit();
 }

Compare

StringBuilder messageString = new StringBuilder();
// Compare both objects
for (int i = 0; i < 2; i++)
{
    messageString.AppendLine("Comparing Class Object " + 
	myInitialObjects[i].Name + " and DB Object " + 
	myFinalObjects[i].Name + ". Result = " + 
	myInitialObjects[i].Equals(myFinalObjects[i]).ToString());
}
MessageBox.Show(messageString.ToString());

删除

using (mySession.BeginTransaction())
{
    // Delete one object from Database
    mySession.Delete(myInitialObjects[0]);
    mySession.Transaction.Commit();
}

显示

using (mySession.BeginTransaction())
{
     ICriteria criteria = mySession.CreateCriteria<employee>();
     IList<employee> list = criteria.List<employee>();
     StringBuilder messageString = new StringBuilder();
     // Load and display the data
     foreach (Employee employee in list)
     {
         messageString.AppendLine("ID: " + employee.ID + " Name: " + employee.Name);
     }
     MessageBox.Show(messageString.ToString());
}

NHibernate 保证只有在引用在同一会话中设置的情况下,两个对象引用才会指向同一对象。 如果我们在一个会话中保存对象并在不同的会话中加载它们,那么这两个对象将是不同的对象。

希望它可以帮助您了解 NHibernate 的基础知识。 祝您编码愉快! :)

关注点

尽管有很多关于 NHibernate 的文章,但本文的目标受众是那些刚开始学习 NHibernate 的人,包括我 :)。 另一篇包含更多信息的优秀文章可在 这里 找到。

历史

  • 2011 年 7 月 7 日 - 初始发布
© . All rights reserved.