對於開發新手,掌握如何將數據庫與Xml映射,是不可切少的,下面開始介紹:
一:何爲NHibernate映射?
其實說白了,就是在數據庫和實體之間,放多一個外置存儲介質Xml,來鏈接兩者的關係,當數據庫發生變化時,通過修改Xml配置,達到映射的切換,從而不需要修改代碼。
讓我們看一個簡單的數據庫和實體間映射的Xml:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
<class name="類名" table="表名" lazy="true" >
<id name="ID" column="ID" type="int" >
<generator class="assigned" />
</id>
<property name="Name" type="string">
<column name="Name" length="51"/>
</property>
</class>
</hibernate-mapping>
其實也是很簡單的,基本由於表或字段太多,這種映射通常需要藉助NHibernate工具來生成!
二:NHibernate映射標籤
其實就是對上面的映射Xml的各種意義的解釋:
1:我們首看根節點,當然下面的內容比上面的詳細:hibernate-mapping標籤
<hibernate-mapping
schema="schemaName" 數據庫schema名稱
default-cascade="none|save-update" 級聯風格(默認 none)
auto-import="true|false" 查詢語句是否可以使用非全限定名
assembly="AssemblyName" 映射文件的類的dll名稱
namespace="Namespace" 映射文件的類的名稱空間名
/>
2:NHibernate class 標籤
<class
name="ClassName" 類的全名。
table="tableName" 數據庫表名。
discriminator-value="discriminator_value" 區分不同的子類值的辨別值,多態行爲時使用。
mutable="true|false" 類的實例是否可變。
schema="owner" 覆蓋在根元素中指定的schema名字。
proxy="ProxyInterface" 代理類的名稱。
dynamic-update="true|false" 動態生成Update語句。
dynamic-insert="true|false" 動態生成Insert語句。
select-before-update="true|false" 更新前先Select一下
polymorphism="implicit|explicit" 隱式查詢或顯式查詢。
where="arbitrary sql where condition" 附加WHERE 條件,在語句中會自動加上。
persister="PersisterClass" 定製IClassPersister。
batch-size="N" 批次讀取數量[默認1]。
optimistic-lock="none|version|dirty|all" 鎖定策略。
lazy="true|false" 是否延遲加載。
abstract="true|false" 是否抽象類。
/>
3:NHibernate ID標籤
<id
name="PropertyName" 實體屬性名稱。
type="typename" NHibernate類型名稱
column="column_name" 數據庫字段名稱。
unsaved-value="any|none|null|id_value" 實例是否不保存。
access="field|property|nosetter|ClassName" NHibernate用來訪問屬性值的策略。
<generator class="generatorClass"/>
</id>
4:NHibernate property標籤
<property
name="propertyName" 實體屬性名稱
column="column_name" 數據庫字段名稱。
type="typename" NHibernate類型名稱。
update="true|false" 是否Update時包含該字段。
insert="true|false" 是否Insert時包含該字段。
formula="arbitrary SQL expression" SQL表達式,定義了這個計算屬性的值
access="field|property|ClassName" NHibernate訪問屬性值的策略
optimistic-lock="true|false" 樂觀鎖定策略
generated="never|insert|always" 屬性值是否是由數據庫生成
/>
三:NHibernate映射類型
1:NHibernate值類型映射
NHibernate類型 |
.NET類型 |
Database類型 |
備註 |
AnsiChar |
System.Char |
DbType.AnsiStringFixedLength - 1 char |
|
Boolean |
System.Boolean |
DbType.Boolean |
在沒有指定類型(type) 屬性時的默認值。 |
Byte |
System.Byte |
DbType.Byte |
在沒有指定類型(type) 屬性時的默認值。 |
Char |
System.Char |
DbType.StringFixedLength - 1 char |
在沒有指定類型(type) 屬性時的默認值。 |
DateTime |
System.DateTime |
DbType.DateTime - ignores the milliseconds |
在沒有指定類型(type) 屬性時的默認值。 |
Decimal |
System.Decimal |
DbType.Decimal |
在沒有指定類型(type) 屬性時的默認值。 |
Double |
System.Double |
DbType.Double |
在沒有指定類型(type) 屬性時的默認值。 |
Guid |
System.Guid |
DbType.Guid |
在沒有指定類型(type) 屬性時的默認值。 |
Int16 |
System.Int16 |
DbType.Int16 |
在沒有指定類型(type) 屬性時的默認值。 |
Int32 |
System.Int32 |
DbType.Int32 |
在沒有指定類型(type) 屬性時的默認值。 |
Int64 |
System.Int64 |
DbType.Int64 |
在沒有指定類型(type) 屬性時的默認值。 |
PersistentEnum |
System.Enum |
潛在類型對應的DbType |
不用在映射文件指定type="PersistentEnum".而是提供枚舉的程序集全名, 讓NHibernate用反射來猜測類型。枚舉使用的潛在類型決定適當的DbType.。 |
Single |
System.Single |
DbType.Single |
在沒有指定類型(type) 屬性時的默認值。 |
Ticks |
System.DateTime |
DbType.Int64 |
type="Ticks"必須被指定。 |
TimeSpan |
System.TimeSpan |
DbType.Int64 |
在沒有指定類型(type) 屬性時的默認值。 |
Timestamp |
System.DateTime |
DbType.DateTime - 取決於數據庫支持 |
type="Timestamp"必須被指定。 |
TrueFalse |
System.Boolean |
DbType.AnsiStringFixedLength - 一個字符,'Y' 或者'N' |
type="TrueFalse"必須被指定。 |
YesNo |
System.Boolean |
DbType.AnsiStringFixedLength - 一個字符,'Y' 或者'N' |
type="YesNo"必須被指定。 |
2:NHibernate應用類型映射
NHibernate Type |
.NET Type |
Database Type |
Remarks |
AnsiString |
System.String |
DbType.AnsiString |
type="AnsiString"必須被指定。 |
CultureInfo |
System.Globalization.CultureInfo |
DbType.String - 表明文化(culture)的5個字符 |
在沒有指定類型(type) 屬性時的默認值。 |
Binary |
System.Byte[] |
DbType.Binary |
在沒有指定類型(type) 屬性時的默認值。 |
Type |
System.Type |
DbType.String 保存應用程序集權限定名。 |
在沒有指定類型(type) 屬性時的默認值。 |
String |
System.String |
DbType.String |
在沒有指定類型(type) 屬性時的默認值。 |
3:NHibernate二進制類型映射
NHibernate Type |
.NET Type |
Database Type |
Remarks |
StringClob |
System.String |
DbType.String |
type="StringClob"必須被指定。 整個字段在內存裏可讀。 |
BinaryBlob |
System.Byte[] |
DbType.Binary |
type="BinaryBlob"必須被指定。 整個字段在內存裏可讀。 |
Serializable |
Any System.Object 必須標註可序列化標籤 |
DbType.Binary |
type="Serializable" 應該被指定. 如果不能爲屬性找到NHibernate類型,這是最後可依靠的類型。 |
NHibernate總結:
本節主要介紹了NHibernate開發中的實體與Xml映射的相關知識。
也是一個可查文檔資料,在開發過程中可多多參考,有助於您的開發!