NHibernate 基本值类型

基本值类型(Basic value types)

基本的值类型大致可以粗糙的分为三组:System.ValueType类型,System.Object类型和支持大对象的System.Object类型.和.NET类型一样,System.ValueType对应的列不能存储null值,而System.Object可以.

表4.3 System.ValueType 映射类型

NHibernate 类型.NET 类型Database 类型备注
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 -忽略毫秒 在没有指定类型(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 - 一个字符,'T' 或者'F'

type="TrueFalse" 必须被指定
YesNo System.Boolean DbType.AnsiStringFixedLength - 一个字符,'Y' 或者'N' type="YesNo"必须被指定

表4.4 System.Object 映射类型

NHibernate 类型.NET 类型Database 类型备注
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) 属性时的默认值

表4.5 Large Object 映射类型

NHibernate 类型.NET 类型Database 类型备注
StringClob System.String DbType.String type="StringClob" 必须被指定.整个字段被读入内存
BinaryBlob System.Byte[] DbType.Binary type="BinaryBlob" 必须被指定. 整个字段被读入内存
Serializable

任何被标记了可序列化属性(SerializableAttribute)的System.Object.

DbType.Binary type="Serializable" 应该被指定. 如果不能为属性找到NHibernate类型,这是最后可依靠的类型。

要掌握NHibernate或者使用某种工具生成NHibernate的hbm.xml文件,应该了解这是一个NHibernate类型名的完整的层。type="integer"被映射为Int32NHibernateType,type="short"被映射为Int16NHibernateType.查看所有的转换你可以查看NHibernate.Type.TypeFactory类的静态构造函数.

自定义值类型(Custom value types)

开发者创建属于他们自己的值类型也是很容易的。比如说,你可能希望持久化Int64类型的属性,持久化成为VARCHAR字段。NHibernate没有内置这样一种类型。自定义类型能够映射一个属性(或集合元素)到不止一个数据库表字段。比如说,你可能有这样的属性:Name {get; set;} ,这是String类型的,对应的持久化到三个字段:FIRST_NAMEINITIALSURNAME

要实现一个自定义类型,可以实现NHibernate.IUserTypeNHibernate.ICompositeUserType中的任一个,并且使用类型的全限定类名来声明属性。请查看NHibernate.DomainModel.DoubleStringType这个例子,看看它是怎么做的。

<property name="TwoStrings" type="NHibernate.DomainModel.DoubleStringType, NHibernate.DomainModel">
<column name="first_string"/>
<column name="second_string"/>
</property>

注意使用<column>标签来把一个属性映射到多个字段的做法。

虽然NHibernate内置的丰富类型和对component的支持意味着你可能很少需要使用自定义类型,至少对于你程序中经常出现的自定义类(并非实体)来说,这是一种好方法。比如说,MonetoryAmount(价格总额)对比使用ICompositeUserType来说更好,虽然它可以很容易的使用一个component实现。这样做的动机之一是抽象。通过自定义类型,以后假若你改变表示金额值的方法时,你的映射文件不需要更改,这就得到了保护。

映射到"任意"(any)类型

TODO

SQL中引号包围的标识符

你可强制NHibernate在生成的SQL中把标识符用引号前后包围起来,这需要在映射文档中使用反向引号(`)把表名或者字段名包围(可能比较拗口,请看下面的例子)。NHibernate会使用相应的SQLDialect(方言)来使用正确的引号风格(通常是双引号,但是在SQL Server中是括号,MySQL中是反向引号)。

<class name="LineItem" table="`Line Item`">
<id name="id" column="`Item Id`">
<generator class="assigned"/>
</id>
<property name="itemNumber" column="`Item #`"/>
...
</class>

映射文件的模块化(Modular mapping files)

允许在独立的映射文档中定义subclassjoined-subclass,直接位于hibernate-mapping下。这就可以让你每次扩展你的类层次的时候,加入新的映射文件就行了。在子类的映射中你必须指定一个extends属性,指明先前已经映射过的超类。如果你使用嵌入的资源(Embedded Resources)配置NHibernate, hbm.xml文件会自动配置为正确的顺序.如果手动添加或者在cfg.xml文件中指定它们,映射文件的排序是非常重要的!

<hibernate-mapping>
<subclass name="Eg.Subclass.DomesticCat, Eg" extends="Eg.Cat, Eg" discriminator-value="D">
<property name="Name" type="String"/>
</subclass>
</hibernate-mapping>
posted @ 2011-08-08 13:20  二锅头  阅读(2030)  评论(0编辑  收藏  举报