对于开发新手,掌握如何将 数据库与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映射的相关知识。
也是一个可查文档资料,在开发过程中可多多参考,有助于您的开发!