對初學者而言,NHibernate 最大的門檻往往在於「配置」。相較於 LINQ to SQL 或 Entity Framework 的開箱即用,NHibernate 需要映射檔案、設定檔、組件參考等多重配置。本文整理實戰經驗,帶您從零建置 NHibernate 環境,並解決常見配置陷阱。
編寫 .hbm.xml 映射檔時,若無智能提示極易出錯。解決方法:
nhibernate-mapping.xsdnhibernate-configuration.xsdC:\Program Files\Microsoft Visual Studio 9.0\Xml\Schemas\提示:NHibernate 版本不同,XSD 檔案位置可能不同。2.1.2 版在 Required_Bins 資料夾下;舊版可能在 src\NHibernate.Config.Templates。
專案需引用下列組件(2.1.2 版):
| 組件 | 用途 |
|---|---|
| NHibernate.dll | 核心庫 |
| NHibernate.ByteCode.Castle.dll | Castle 動態代理(延遲載入必須) |
| Antlr3.Runtime.dll | HQL 查詢解析 |
| Iesi.Collections.dll | 集合類型支援 |
| log4net.dll | 日誌記錄 |
| Castle.Core.dll | Castle 核心(代理工廠設為 Castle 時需求) |
| Castle.DynamicProxy2.dll | 動態代理實作 |
版本差異提醒:NHibernate 2.0.1 可不設定 proxyfactory.factory_class;但 2.1.2 版必須明確指定代理工廠,否則延遲載入失效。
所有 *.hbm.xml 檔案在屬性視窗中,將 Build Action 設為 Embedded Resource。否則執行時會拋出找不到映射資源的異常。
識別物件是否為暫態(未持久化)的關鍵:
unsaved-value="0"unsaved-value="00000000-0000-0000-0000-000000000000"unsaved-value="null" 或空字串詳細說明請參考:CSDN 部落格文章
Configuration_Templates 資料夾複製對應資料庫的設定檔(如 hibernate.cfg.xml)<session-factory> 區段加入組件對應:<mapping assembly="Model" />常見錯誤:預設模板缺少 mapping assembly 設定,必須手動加入,否則會出現「找不到持久化類別」異常。
錯誤的 name、assembly、namespace 會導致:
NHibernate.MappingException: persistent class not found
檢查清單:
name:完整類型名稱(含命名空間)assembly:組件名稱(不含 .dll)namespace:命名空間(可選,若 name 已含完整命名空間可省略)| 檢查項目 | 正確設定 |
|---|---|
| 映射檔 Build Action | Embedded Resource |
| hibernate.cfg.xml 中 mapping assembly | 已加入實體類別所在組件名稱 |
| 資料庫連線字串 | 正確且可連線 |
| proxyfactory.factory_class | 已設定(如 Castle) |
| 必要 DLL 皆已參考 | 版本一致 |
| 實體類別屬性 | 標記 virtual |
| unsaved-value | 符合主鍵型別預設值 |
NHibernate 配置雖繁瑣,但遵循「映射檔嵌入資源、設定檔加入組件對應、代理工廠必須指定、版本相依組件齊全」四大原則,即可避開 90% 的初學者陷阱。建議新手先從簡單單表操作起步,逐步掌握映射技巧,再挑戰複雜關聯配置。