天天看點

NHIBERNATE之映射檔案配置說明(轉載4)二十、自定義值類型二十一、任意(Any)類型映射二十二、SQL中引号包圍的辨別符二十三、子產品化映射檔案二十四、資料庫生成屬性(Generated Properties)二十五、資料庫輔助對象

   開發者建立屬于他們自己的值類型也是很容易的。比如說,你可能希望持久化Int64類型的屬性, 持久化成為VARCHAR 字段。NHibernate沒有内置這樣一種類型。自定義類型能夠映射一個屬性(或集合元素)到不止一個資料庫表字段。

比如說,你可能有這樣的屬性: Name { get; set; },這是String類型的,對應的持久化到三個字段:FIRST_NAME, INITIAL, SURNAME。

要實作一個自定義類型,可以實作NHibernate.UserTypes.IUserType或NHibernate.UserTypes.ICompositeUserType中的任一個,

并且使用類型的全限定類名來定義屬性。請檢視 NHibernate.DomainModel.DoubleStringType這個例子,看看它是怎麼做的。

 注意使用<column>标簽來把一個屬性映射到多個字段的做法。

  ICompositeUserType, IEnhancedUserType, INullableUserType, IUserCollectionType, 和 IUserVersionType接口為更特殊的使用方式提供支援。

  你甚至可以在一個映射檔案中提供參數給一個IUserType。 為了這樣做,

你的UserType必須實作NHibernate.UserTypes.IParameterizedType接口。為了給自定義類型提供參數,你可以在映射檔案中使用<type>元素。

  現在,IUserType 可以從傳入的IDictionary對象中得到default 參數的值。

  盡管 NHibernate 内建的豐富的類型和對元件的支援意味着你可能很少 需要使用自定義類型。不過,

為那些在你的應用中經常出現的(非實體)類使用自定義類型也是一個好方法。例如, 一個MonetaryAmount類使用ICompositeUserType來映射是不錯的選擇,雖然他可以很容易地被映射成元件。這樣做的動機之一是抽象。使用自定義類型,以後假若你改變表示金額的方法時,它可以保證映射檔案不需要修改。

   這是屬性映射的又一種類型。<any> 映射元素定義了一種從多個表到類的多态關聯。

這種類型的映射常常需要多于一個字段。第一個字段持有被關聯實體的類型,其他的字段持有辨別符。

對這種類型的關聯來說,不可能指定一個外鍵限制,是以這當然不是映射(多态)關聯的通常的方式。

你隻應該在非常特殊的情況下使用它(比如,審計log,使用者會話資料等等)。

  meta-type屬性使得應用程式能指定一個将資料庫字段的值映射到持久化類的自定義類型。

這個持久化類包含有用id-type指定的辨別符屬性。 你必須指定從meta-type的值到類名的映射。

   NHibernate也支援meta-type="class"标簽,這個例子裡meta-value不是必須的, 因為 meta-value就是持久化類名(persistentClass.FullName)。

  但你使用meta-type="class"在查詢語句裡設定參數時,你必須使用下面的代碼:

  映射檔案部分:

 說明:

(1)

name: 屬性名。

(2)

id-type: 辨別符類型。

(3)

meta-type (可選 -預設是 string):

允許辨識标志(discriminator)映射的任何類型。

(4)

cascade (可選 -預設是none): 級聯的類型。

(5)

access (可選 -預設是 property): NHibernate

用來通路屬性值的政策。

(6)

optimistic-lock (可選 -預設是 true):

表明更新此元件是否需要擷取樂觀鎖。換句話說,當這個屬性變髒時,是否增加版本号(Version) 。  

   你可強制NHibernate在生成的SQL中把辨別符用引号前後包圍起來,這需要在映射文檔中使用反向引号(`)把表名或者字段名包圍(可能比較拗口,請看下面的例子)。NHibernate會使用相應的SQLDialect(方言)來使用正确的引号風格(通常是雙引号,但是在SQL

Server中是括号,MySQL中是反向引号)。

   允許在獨立的映射文檔中定義subclass和joined-subclass,直接位于hibernate-mapping下。這就可以讓你每次擴充你的類層次的時候,加入新的映射檔案就行了。在子類的映射中你必須指定一個extends屬性,指明先前已經映射過的超類。使用這個功能的時候,一定要注意映射檔案的排序是非常重要的!

   Generated

properties指的是其值由資料庫生成的屬性。一般來說,如果對象有任何屬性由資料庫生成值,NHibernate應用程式需要進行重新整理(Refresh)。但如果把屬性标明為generated,就可以轉由NHibernate來負責這個動作。實際上。對定義了generated

properties的實體,每當NHibernate執行一條SQL INSERT或者UPDATE語句,會立刻執行一條select來獲得生成的值。

  被标明為generated的屬性還必須是 non-insertable和 non-updateable的。隻有(version)(可選),時間戳

(可選)和屬性可以被标明為generated。

never (預設) 标明此屬性值不是從資料庫中生成。

insert -

标明此屬性值在insert的時候生成,但是不會在随後的update時重新生成。比如說建立日期就歸屬于這類。

always -

标明此屬性值在insert和update時都會被生成。 

   幫助CREATE和DROP任意資料庫對象,與NHibernate的schema互動工具組合起來,可以提供在NHibernate映射檔案中完全定義使用者schema的能力。雖然這是為建立和銷毀trigger(觸發器)或stored

procedure(存儲過程)等特别設計的,實際上任何可以在IDbCommand.ExecuteNonQuery()方法中執行的SQL指令都可以在此使用(比如ALTER,

INSERT,等等)。本質上有兩種模式來定義輔助資料庫對象。

  第一種模式是在映射檔案中顯式聲明CREATE和DROP指令:

   第二種模式是提供一個類,這個類知道如何組織CREATE和DROP指令。這個特别類必須實作NHibernate.Mapping.IAuxiliaryDatabaseObject接口。

 你也可以在配置檔案裡設定參數傳給資料庫對象。

NHibernate可以調用IAuxiliaryDatabaseObject.SetParameterValues方法接受dictionary參數。

  還有,這些資料庫對象可以特别指定為僅在特定的方言中才使用。