2.3 基本配置

NHibernate可以配置到几乎在所有的.NET应用程序中运行。一般来说,NHibernate使用两到三层的服务器客户端。客户端通常是一个网站,但是也可以是一个桌面式应用程序。虽然我们在这本书只关注网站,但我们也会覆盖桌面程序。

首先从Configuration实例中创建一个ISessionFactory实例。

 

2.3.1 创建SessionFactory

     为了去创建一个ISessionFactory实例,你首先要在程序初始化时创建一个Configuration实例,然后使用它去设置数据库和映射的信息。一旦配置完成,Configuration实例就可以用来创建SessionFactory。之后,你就可丢弃Configuration实例。

     在之前的例子中,我们使用了一个MySessionFactory的静态属性去创建ISession实例,下面是它的定义:

NHibernate in action翻译——第二章 2.3(基本配置)_Nhibernate

 

   映射文件Employee.hbm.xml的位置跟应用程序的当前目录有关。在这个例子中,你也可以使用XML文件区设置所有的配置。

 

方法链

方法链是一种编程风格,它被很多的NHibernate接口支持。这种风格在Smalltalk中要比在.NET中流行,它被认为是可读性低、更难去理解,但是它在很多情况下非常方便。

很多的.NET开发者定义没有返回值的方法。在Smalltalk中,是没有void类型的,它通常返回它接收的对象。这可以让你去重写上面的代码:

 

ISessionFactory sessionFactory =new Configuration()

      .Configure()

      .AddXmlFile(“Employee.hbm.xml”)

      .BuildSessionFactory();

 

注意到你不需要定义一个Configuration的变量。

我们会在一些示例中使用这种风格;但是如果你不喜欢它,你可以不使用。

 

为了方便,NHibernateXML映射文件以.hbm.xml扩展名为后缀,每一个类配备一个映射文件,而不是把所有的映射放在一个文件中(这被认为是一种坏的设计)。“Hello World”示例只有一个持久化类,因此只有一个映射文件。但是如果你有多个持久化类,你应该为每个持久化类配置一个映射文件。那么在哪里放置映射文件呢?

映射文件

映射文件最好跟持久化类放置在同一个目录下。例如Employee类的映射文件应该命名为Employee.hbm.xml,放置在与Employee.cs同一目录下。我建议你跟着练习使用AddXmlFile()去加载多个映射文件。

你也可以把XML映射文件嵌入到.NET中。那么你就必须告诉编译器每一个文件是嵌入文件;Visual Studio可以很容易的完成这个任务。然后使用AddClass()方法,使用如下:

 

ISessionFactory sessionFactory = new Configuration()

   .Configure()

   .AddClass(typeof(Model.Item))

   .AddClass(Typeof(Model.User))

   .AddClass(Typeof(Model.Bid))

   .BuildSessionFactory();

 

AddClass()方法假设映射文件的后缀名为.hbm.xml而且内嵌在跟类文件同一个引用下。

如果你想添加所有的内嵌映射文件,你可以使用方法AddAssembly()

 

ISessionFactory sessionFactory = new Configuration()

   .Configure()

   .AddInputStream(// .NET Attributes

         HbmSerializer.Default.Serialize(typeof(Model.Item).Assembly))

   .AddAssembly(typeof(Model.Item).Assembly)//XML

   .BuildSessionFactory();

 

提示:不要使用应用程序名作为参数(如“NHibernate.Auction”)。你要直接使用一个类的类型直接检索包含映射文件的引用。

 

为什么NHibernate会提示不知道你的类?

当你开始使用NHibernate时,你必须确定所有的映射文件都让NHibernate知道了,如果你漏了一个,你将会得到一个异常。当创建session Factory时,他会报一个异常:refers to an unmapped class:YourClass。当你执行一个查询的时候,他会报一个异常:possible an invalid or unmapped class name was used in the query

为了去解决这个问题,第一步是在INFO层设置日志(将在3.3.2节介绍)。然后阅读日志;你应该找到一条信息如:Mapping class: Namespace. YourClass ->YourClass。然后检查你的初始化代码,确认是否包含所有的映射文件。

如果你使用AddAssembly(),去确定hbm.xml文件为嵌入文件。

 

多数据库和SESSION FACTORIES

我们已经演示过单SessionFactory的程序了,这已经可以适用于大多数的程序需要。如果你需要多个ISessionFactory实例,以便去管理多个数据库。每一个SessionFactory被一个数据库使用,然后创建ISession实例去为特定的数据库工作。一旦你拥有了SessionFactory,你就可以去创建session,然后开始加载和保存对象。

配置技巧

你需要指定数据库连接,和各种能在运行时影响NHibernate行为的设置。配置文件的属性非常多,但是不要担心,大多数有默认值。只有少数需要修改的。

为了去指定配置选项,你需要使用以下技巧:

1、              传递一个System.Collections.IDictionary的实例给Configuration.SetProperties(),或者使用Configuration.SetProperty为每一个属性设置(或者直接使用Configuration.Properties)。

2、              在应用程序配置文件中设置所有的属性(App.config或者Web.config)。

3、              包含<property>元素在名为hibernate.cfg.xmlxml文件中,把这个文件放在当前目录下。

 

第一种选择是很少使用到的,除了一些快速测试,大多数的应用程序需要一个灵活的配置文件。应用程序配置文件和hibernate.cfg.xml文件都提供相同的功能:配置NHibernate。你选择哪种方式只是你个人喜好。Hibernate.cfg.xml的取名只是一个惯例。你可以使用任何的文件名(例如NHibernate.config.config文件当ASP.NET部署是会被自动保护),然后提供文件名给Configure()方法。你可以同时使用这两种文件,一种为开发,一种为部署。

我们很少使用非正统的方法去在打开NHibernateISession的时候让应用程序提供ADO.NET IDbConnection(例如,通过调用SessionFactory.OpenSessionmyConnection))。使用这种选择,代表你不必指定任何数据库连接的属性(其他属性还是要指定的)。我们不推荐这种做法。

对于所有的配置选项,dagtabase-connection是最重要的,因为如果没有它,NHibernate将会不知道怎样跟数据库打交道。

 

2.3.2 配置ADO.NET数据库访问

大多数时候,应用程序有责任去获取ADO.NET的连接。NHibernate是应用程序的一部分,因此他有责任去获取这些连接。你需要告诉NHibernate怎样去获取(创建)一个ADO.NET数据库连接。

Figure2.2显示了.NET 应用程序是怎么跟ADO.NET互相作用。没有NHibernate的时候,应用程序通常从连接池中获取一个ADO.NET连接,然后使用这个连接去执行SQL语句。

NHibernate in action翻译——第二章 2.3(基本配置)_应用程序_02

当使用NHibernate的时候,示图改变了:NHibernate作为ADO.NET的客户端和他的连接池,如图Figure2.3所示。应用程序使用NHibernateISessionIQueryAPI来操作持久化和使用NHibernateITransactionAPI来控制数据库的事务。

NHibernate in action翻译——第二章 2.3(基本配置)_NH_03

使用hibernate.cfg.xml配置NHibernate

以下是hibernate.cfg.xml文件的代码列表,它是用来配置NHibernate去访问Microsoft SQL Server 2000数据库的。

<?xml version="1.0" ?>

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">

 <session-factory>

    <property name="connection.provider">

      NHibernate.Connection.DriverConnectionProvider

    </property>

    <property name="dialect">

      NHibernate.Dialect.MsSql2000Dialect

    </property>

    <property name="connection.driver_class">

      NHibernate.Driver.SqlClientDriver

    </property>

    <property name="connection.connection_string">

      Data Source=(local); Initial Catalog=nhibernate;

      Integrated Security=SSPI

    </property>

 </session-factory>

</hibernate-configuration>

代码指出了一下信息:

1、              connection.provider指出了应用了IConnectionProvider接口的类名;这里我们使用默认的。

2、              dialect指定了应用了数据库方言的名称。方言是NHibernate用来指定数据库的特性的。尽管有ANSI标准化的作用,但是SQL依然在不同的数据库中有不同的形式。你必须指定一种方言,NHibernate包含了对大多数SQL数据库的支持,和添加一种新的方言也是非常容易的。

3、              connection.driver_class指定了应用的ADO.NET驱动。注意,当使用不完整的驱动名时,你必须添加一个<qualifyAssembly>元素在配置文件中指定符合的名字,以便NHibernate可以成功地加载它。

4、              connection.connection_string指定了一个标准的ADO.NET连接字符串,是用来创建数据库连接的。

开始NHibernate

怎么样利用这些属性去开始创建NHibernate应用程序?你定义了这些属性在hibernate.cfg.xml文件中,你需要把这个文件放在应用程序目录下。当你创建一个Configuration对象和调用Configure()方法时,他会被自动地识别和读取。

让我总结一下配置的步骤吧:

1、    如果你的数据库ADO.NET数据驱动还没有安装,去下载和安装它;如果你正在使用SQL Server,那么你可以跳过这一步。

2、    添加引用log4net.dll到你的项目中。这是可选的,但是推荐这样做。

3、    决定NHibernate需要的数据库访问属性。

4、    放置hibernate.cfg.xml文件在当前目录以便Configuration读取这些属性。

5、    在你的应用程序中创建一个Configuration实例,调用Configure()方法;使用HbmSerializer.Default.Serialize()AddInputStream()加载映射类;使用AddAssembly()AddClass()AddXmlFile()加载映射文件。从Configuration调用BuildSessionFactory()创建一个ISessionFactory实例。

6、    当你用完NHibernate时,记得关闭ISessionFactory(使用MySessionFactory.Close())。大多数情况,当你关闭你的应用程序时你才会关闭ISessionFactory