使用NHibernate最重要的一步就是配置,如果連NHibernate都還沒有跑的起來,談何學習。今天就來詳解一下NHibernate的配置。
一、NHibernate基本配置
NHibernate配置要注意的有:
1、NHibernate需要一個自定義的配置節點,一般放在Web.config里或App.config里面,當然你可以自己定義實際位置。
示例如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name ="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler,NHibernate"/> (1) </configSections> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > <session-factory name="Dao"> <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> (2) <property name="connection.connection_string"> Data Source=KISSDODOG-PC;Initial Catalog=Test;uid=sa;pwd=123; (3) </property> <property name ="dialect">NHibernate.Dialect.MsSql2008Dialect</property> (4) <mapping assembly ="Model"/> (5) </session-factory> </hibernate-configuration> </configuration>
(1)、聲明自定義配置節點
name:自定義配置節點名稱。
type:處理程序位置。
(2)、聲明是哪一個數據庫驅動程序。
(3)、數據庫連接。
(4)、所使用的SQL方言,通過這個方言,NHibernate才知道要將你寫的查詢語句,翻譯成何種數據庫的SQL語句。
(5)、設定映射文件默認所在的程序集。‘
NHibernate的配置節點並不止5個,想知道更詳細的配置節點說明:http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919873.html
另外,這一個配置節點文件,並不一定要放在Web.config或App.config里,例如你可以定義一個hibernate.cfg.xml文件,然后創建ISessionFactory時指定位置:
ISessionFactory sessionFactory = new Configuration().Configure(AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "hibernate.cfg.xml").BuildSessionFactory();
這里要小心"new Configuration().Configure()",如果沒有Configure("xxx.cfg.xml")就是從配置文件加載,有就是從自定義文件(如:xxx.cfg.xml)加載。
注意,此hibernate.cfg.xml文件名可以隨意起,但是要設置為始終復制。否則將報告如下錯誤:
An exception occurred during configuration of persistence layer.
2、NHibernate的映射文件一定要設為嵌入的資源。

3、NHibernate的實體類所有的屬性都要加上virtual-虛屬性,具體將在持久化類的文章中說明,下面給個例子:
public class PersonModel { public virtual int Id { get; set; } public virtual string Name { get; set; } }
NHibernate作為一個ORM框架,它需要知道如何將數據庫的表與對應的實體類相關聯,NHibernate通過映射文件的方式來獲得這方面的信息。
二、獲取映射文件相關配置
NHibernate中的映射文件以hbm.xml為后綴結束,NHibernate獲取映射文件的方法有3種方法。
1、從config程序配置文件獲取映射文件位置
NHibernate運行在.Net程序上,需要自己提供一個自定義配置節點,這個配置節點里面包含了數據庫連接,什么數據庫等等信息。其中就包括了配置文件所在位置的信息。
NHibernate會直接從Web.config或App.config文件上的配置節點上讀取這個節點,然后從節點指定的程序集去查找映射文件。
<mapping assembly ="Nx.Repository"/>
以上這個配置節點所保存的就是映射文件默認所在的程序集。這樣當程序啟動時,NHibernate就會自動去Nx.Repository尋找*.hbm.xml映射文件。
如果NHibernate找不到映射文件,則可能會報如下錯誤:
“/”應用程序中的服務器錯誤。
No persister for: xxx.xxx
2、編程的方式,寫在代碼里
(1)、AddFile 指定映射文件
ISessionFactory sessionFactory = new Configuration().Configure().AddFile(@"C:\Users\Administrator\Desktop\NHibernate學習\Model\Mapping\Person.hbm.xml").BuildSessionFactory();
注意,當你不寫全路徑的時候,也就是只寫個文件名,那么NHibernate就會從配置文件讀取程序集,到配置文件中指定的程序集去加載此映射文件。如果配置文件並不指定程序集,那么就從當前程序集中查找指定名的映射文件。但這種方式,不必設置嵌入的資源,但要記得設置為始終復制。
Configuration cfg = new Configuration().AddFile("Mapping/Person.hbm.xml"); ISessionFactory sessionFactory = cfg.BuildSessionFactory();
這種方法只是指定一個文件,但是可以鏈式指定多個如:AddFile("f1").AddFile("f2")。
(2)、AddAssembly
還有另外一種方法,在創建Configuration時指定程序集。
Configuration cfg = new Configuration().AddAssembly("Model"); //Model為映射文件所在程序集名稱 ISessionFactory sessionFactory = cfg.BuildSessionFactory();
這種方法,即使.config配置文件里<mapping assembly=""/>節點為空也沒關系,NHibernate會自動到指定的程序集里查找所有以.hbm.xml結尾的文件。
(3)、AddClass
這種方式,可以消除程序對文件路徑字符串的硬編碼。
Configuration cfg = new Configuration().AddClass(typeof(Model.Person)); ISessionFactory sessionFactory = cfg.BuildSessionFactory();
但是缺點也非常明顯,類名必須與映射文件的名稱相同。不然,編譯就無法通過,因為Person類都找不到。另外,映射文件Person.hbm.xml必須放在根目錄。
NHibernate會自動到程序中去查找名為Person.hbm.xml文件。
