NHibernate 基础






4.73/5 (28投票s)
NHibernate 入门,一个小应用程序,演示将对象保存到数据库以及从数据库加载对象。

引言
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
的新数据库。
然后添加一个名为 Employee
的表,其中包含两列:ID
和 Name
。
ID
应为主键并用作标识。 不要忘记在属性中启用 标识规范。
业务对象
数据库已准备好进行演示。 现在启动 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 文件的属性中,将生成操作设置为 嵌入的资源。

配置
添加一个新的应用程序配置文件 (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 日 - 初始发布