NHibernate 快速入门 已翻译 100%

徐继开 投递于 2013/07/11 23:56 (共 20 段, 翻译完成于 07-13)
阅读 16119
收藏 65
4
加载中

这篇教程将透过你的第一个NHibernate项目,讲述配置和映射所需要的基本步骤。

仅关注我们想要的,我们将从一个很简单的例子开始。为了让代码量最小,我们也去掉了单元测试和接口的代码,专一地关注持久化数据的代码并阐述一些基本的CRUD(Change, Read, Update, Delete) 技术。

这篇教程和其他样例中要用到的工具:

Microsoft SQL Server 2005 Express Edition - 存放我们的持久化数据。这篇教程在SQL Server 2008环境下也有效。在这篇教程中,我假设你有一个本地SQL Server的实例并且熟练地使用SQL Manger Studio。

NHibernate version 2.1.2 - 你可以点击下方链接下载最先的 NHibernate:  http://sourceforge.net/projects/nhibernate/files/NHibernate/

Microsoft Visual Studio 2008 - 我们的开发环境。

徐继开
徐继开
翻译于 2013/07/13 10:39
3

创建项目文件

在这个例子里,因为我们不关注用户界面 ,所以我们将从创建一个新的控制台应用程序项目开始:

根据这篇教程的目的,我们把我们的应用程序取名叫'HelloNHibernate'。我也推荐坚持这种命名的传统,并遵循不同的样例使用不同的名字,尽管在很多情形下,教程的其他部分也会使用这样的命名。 

徐继开
徐继开
翻译于 2013/07/13 10:26
2

添加对NHibernate的引用

我们下一步要添加一系列让NHibernate发挥作用的必须添加的引用。当你下载并解压你的NHibernate安装包后,电脑上就会创建一些目录,包括 'Required_bins'和'Required_for_LazyLoading。

首先,你要把 Required Bins目录下所有的DLL包含进来 - 它们代表NHibernate使用的核心组件。

其次,我们把Required_for_LazyLoading的一个子目录下所有的Dll包含进来。选择哪个目录的Dll来完成延迟加载,最终将取决于你。 在这篇教程和其他文章中,我使用的是Castle dynamic proxy。

徐继开
徐继开
翻译于 2013/07/13 10:46
2

配置NHibernate

建立好我们的引用之后,我们现在需要创建和更新我们的App.config (如果是网站,就修改Web.config)。在我们的项目中,我做以下几个假设:

  • 我们安装了SQL Server 2005并创建好了数据库.

  • 数据库开启了信任连接

  • 使用Castle proxy factory

  • 把TSQL语句输出到控制台(在你学习NHibernate的时候,我强烈推荐你这样做,因为你可以看到后台正在做什么).

这是一个App.config配置的例子,它包含了这篇教程中所需要的部分。

<?xmlversion="1.0"encoding="utf-8" ?>

<configuration>

    <configSections>
        <sectionname="hibernate-configuration"requirePermission="false"type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
    </configSections>

    <hibernate-configurationxmlns="urn:nhibernate-configuration-2.2">
        <reflection-optimizeruse="false" />
        <session-factory>
            <propertyname="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
            <propertyname="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
            <propertyname="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
            <propertyname="connection.connection_string">Data Source=(local); Initial Catalog=quickstart; Trusted_Connection=true;</property>
            <propertyname='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
            <propertyname="show_sql">true</property>
        </session-factory>
    </hibernate-configuration>
</configuration>

在配置中,你将看到我们创建NHibernate来使用SQL Server和SQL 2005的语句。你也能看到连接字符串(可以根据需要修改),还有对Castle Proxy Factory的引用,也有一个告诉Nhibernate输出TSQL语句到控制台的标志(show_sql)。 

徐继开
徐继开
翻译于 2013/07/13 10:56
3

创建我们的模型

NHibernate允许你直接使用Plain Old CLR Objects (POCOs),而不用通过存储程序来直接和数据库交互。使用POCOs的一个优势在于我们不用绑定特定的持久化层。举个例子,有些ORM解决方案需要特殊属性,或者是基于你的模型对象,这些对象又是从特定的基类中继承而来的。

在NHibernate中,不用特殊的修饰,就可以让我们的对象和持久化层交互。在NHibernate中,我们唯一要意识到的是所有的我们希望持久化的属性必须是虚拟的,并且要开启延迟加载,所有类中的公共方法必须是虚拟的,哪怕它们并没有包含到我们的映射文件中。

通常来讲,最好把所有的属性都设置为虚拟的,这样你的基类就封装了,不管你使用延迟加载与否。

徐继开
徐继开
翻译于 2013/07/13 14:37
1

另外,我们可以让POCO里的属性和方法不持久,并且可以让多个POCOs映射到数据库中相同的数据表。举个例子,我们有一个POCO提供了产品的详情,包括图片和描述,其他的轻量版本只包括用来创建商品清单的名称和数量。

在我们的教程中,我们将创建一个极端的简单对象。在后期的教程中,我们会讲述更加复杂的话题,比如父子关系,高级搜索技术等等。

创建在你的项目中创建一个类,命名为‘Produce’,并设置如下的属性。注意Nhibernate是大小写敏感的,所以我们的属性名要准确地匹配后面要创建的Nhibernate映射。

namespace HelloNHibernate
{
    public classProduct
    {
        public virtual int? ProductId { get; set; }
        public virtual string ProductName { get; set; }
    }
}

注意我们设置ProductId为可为null的值。这允许我们创建一个没有ID的实例,反过来告诉NHibernate这是一个新对象而不是一个ID为'0'的对象。

徐继开
徐继开
翻译于 2013/07/13 14:48
1

创建NHibernate映射文件

Nhibernate使用XML映射文件来映射POCO到数据库对象。虽然在很多案例中这可能是一对一关系,但这并不是必要的。你可以轻易地更改字段名称并创建不同的映射来给数据库对象创建可选的表示区域。

举个例子,我们有一个复杂的'Product'对象,它包含了大量的文本信息,一个与订单和复杂清单数据的容易。这对于我们正在编辑的单个产品的产品详情区域来说,将是一个很好的映射,它将变得十分臃肿,以至于在产品的下拉列表中,它不能作为一个强类型列表的成员。在后面,要创建一个更简单一点到只有产品ID和产品名称的持久化区域的映射。

在我们的教程中,我们使用一个简单的直接关系到我们上面创建的POCO的映射。来创建这样的一个映射,我们要添加一个新的XML文件到上面展示的工程中。当创建XML文件时,要让它以.hbm.xml命名方式结尾-这种传统告诉NHibernate这是一个映射文件。我们的名称叫做'Product.hbm.xml'。

徐继开
徐继开
翻译于 2013/07/13 15:01
1
你的XML文件应该包含以下信息。下面我们将一一讲述每一个标签:
<?xmlversion="1.0"encoding="utf-8" ?>
<hibernate-mappingxmlns="urn:nhibernate-mapping-2.2"
                           assembly="HelloNHibernate"
                           namespace="HelloNHibernate">

    <class name="Product" table="Products">
        <id name="ProductId">
            <generatorclass="identity"/>
        </id>
        <property name="ProductName"length="50" />
    </class>
</hibernate-mapping>
  • 在hibernate-maping标签中,我们同时引用类集(POCOs)所属的程序集合命名空间。当你的映射文件在单独的命名空间或者程序集而不是模型中,这种方式是十分方便的。

  • class元素表示到单个POCO的映射。name表示上面的程序集和命名空间中的类名,table属性告诉NHibernate数据库中的哪个表或者视图将被映射。

  • id元素告诉NHibernate哪个数据库的字段和对应的对象作为一个唯一键来使用。在本例子中,我们使用ProductId这个字段。

  • generator元素告诉NHibernate怎样给新实体来创建唯一ID。因为我们使用SQL Server属性中的ID属性,所以我们指明generator类为'identity'。

  • property标签是你见得最多的标签。它简单地映射一个到数据表或者视图中对应字段的映射。我已经把这个例子中最长的属性包含进来了,因为我们想为映射创建一个架构。对于我们所需要的产品名称,默认的255个字符已经足够大了。

徐继开
徐继开
翻译于 2013/07/13 15:15
1

一旦XML文件创建好了,你需要确保它被设置为嵌入式资源,否则NHibernate不会读出你的XML文件,那么映射就不会生效了。完成这一步,你要在解决方案资源浏览器中点击你新建的XML文件,更改XML的生成方式。

 

到这一步,你的解决方案应该和下图类似:

 

徐继开
徐继开
翻译于 2013/07/13 15:18
2

使用 NHibernate连接数据库

到了这一步,我们已经完成了安装和配置,现在就准备使Nhibernate和我们的数据库来交互。

透过这些例子,我推荐你单独跟着做,并观察对象是如何发生改变的,数据又是如何持久化到数据库的。在你观察持久化对象改变的时候,这有助于你更好地理解NHibernate是如何工作的,有助于你巩固下面的样例。

下面到了代码了!在第一个样例中,我们只关注使用NHibernate来完成持久化数据所需要的最小量的代码,而不关注测试和其他更好的实践,注意到这些事很重要的。当我们引申到更复杂的样例中,我们要花费更多的时间为你的实际程序来创建运行更好的,更加健壮的架构。

在NHibernate中,我们的根对象将是一个实现ISessionFactory接口的对象。一个SessionFactory是一个很昂贵的对象,在你的程序中,你只有在需要一个就够了。

徐继开
徐继开
翻译于 2013/07/13 15:30
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(25)

T
Troy_Zhang
可以学习
无聊的人啊
无聊的人啊

引用来自“北落”的评论

引用来自“都市网达”的评论

引用来自“北落”的评论

引用来自“秦时明月”的评论

引用来自“在会议中指出”的评论

引用来自“北落”的评论

NHibernate2.2的时候用过,之后就没有使用的机会了。.Net下毕竟还是微软自己的东西好用

的确 - -

或许大家看见这么多配置文件都累了,
看看Moon.Orm,有多么强大.
http://www.cnblogs.com/humble/archive/2013/05/01/3052826.html

@红薯 这有打广告的 请速度来把Moon.Orm收了

Moon.Orm的自动生成很蛋痛

@秦时明月 速度来解答疑惑

自动生成什么?不爽的地方?
北落
北落

引用来自“都市网达”的评论

引用来自“北落”的评论

引用来自“秦时明月”的评论

引用来自“在会议中指出”的评论

引用来自“北落”的评论

NHibernate2.2的时候用过,之后就没有使用的机会了。.Net下毕竟还是微软自己的东西好用

的确 - -

或许大家看见这么多配置文件都累了,
看看Moon.Orm,有多么强大.
http://www.cnblogs.com/humble/archive/2013/05/01/3052826.html

@红薯 这有打广告的 请速度来把Moon.Orm收了

Moon.Orm的自动生成很蛋痛

@秦时明月 速度来解答疑惑
Null--Null
Null--Null

引用来自“北落”的评论

引用来自“秦时明月”的评论

引用来自“在会议中指出”的评论

引用来自“北落”的评论

NHibernate2.2的时候用过,之后就没有使用的机会了。.Net下毕竟还是微软自己的东西好用

的确 - -

或许大家看见这么多配置文件都累了,
看看Moon.Orm,有多么强大.
http://www.cnblogs.com/humble/archive/2013/05/01/3052826.html

@红薯 这有打广告的 请速度来把Moon.Orm收了

Moon.Orm的自动生成很蛋痛
无聊的人啊
无聊的人啊

引用来自“北落”的评论

引用来自“秦时明月”的评论

引用来自“在会议中指出”的评论

引用来自“北落”的评论

NHibernate2.2的时候用过,之后就没有使用的机会了。.Net下毕竟还是微软自己的东西好用

的确 - -

或许大家看见这么多配置文件都累了,
看看Moon.Orm,有多么强大.
http://www.cnblogs.com/humble/archive/2013/05/01/3052826.html

@红薯 这有打广告的 请速度来把Moon.Orm收了

moon.orm已经收了
北落
北落

引用来自“秦时明月”的评论

引用来自“在会议中指出”的评论

引用来自“北落”的评论

NHibernate2.2的时候用过,之后就没有使用的机会了。.Net下毕竟还是微软自己的东西好用

的确 - -

或许大家看见这么多配置文件都累了,
看看Moon.Orm,有多么强大.
http://www.cnblogs.com/humble/archive/2013/05/01/3052826.html

@红薯 这有打广告的 请速度来把Moon.Orm收了
徐继开
徐继开

引用来自“都市网达”的评论

把源码打包,提供下载,Could not compile the mapping document: ***.hbm.xml

http://sourceforge.net/projects/nhibernate/files/NHibernate/
无聊的人啊
无聊的人啊

引用来自“在会议中指出”的评论

引用来自“北落”的评论

NHibernate2.2的时候用过,之后就没有使用的机会了。.Net下毕竟还是微软自己的东西好用

的确 - -

或许大家看见这么多配置文件都累了,
看看Moon.Orm,有多么强大.
http://www.cnblogs.com/humble/archive/2013/05/01/3052826.html
无聊的人啊
无聊的人啊

引用来自“北落”的评论

NHibernate2.2的时候用过,之后就没有使用的机会了。.Net下毕竟还是微软自己的东西好用

或许大家看见这么多配置文件都累了,
看看Moon.Orm,有多么强大.
http://www.cnblogs.com/humble/archive/2013/05/01/3052826.html
无聊的人啊
无聊的人啊

引用来自“赵远明”的评论

记得用nh是几年前的事了

或许大家看见这么多配置文件都累了,
看看Moon.Orm,有多么强大.
http://www.cnblogs.com/humble/archive/2013/05/01/3052826.html
返回顶部
顶部