NHibernate中对于字符型(以SQL Server数据类型为例,包括:char,varchar,Text,nvarchar,nText等)的字段,映射到.Net类型时都为String。
由于NHibernate的映射文件中每个属性映射是这样的:
<property name="Content" column="Content" type="String" />
没有对于数据库物理类型的说明。因此NHibernate按照默认(当然是NHibernate默认)的类型进行转换。因此.Net的String类型,它对应多种物理类型,问题就出现了。当我不想让我的String类型属性对应默认的物理类型时该怎么办呢?
我在前一段的一个工程就发生了这样的问题,一个属性是String 类型,对应数据库的Text类型字段,但是当进行数据存储时,如果字符串长度超过了8000,NHibernate就自动将其截断为4000长度(显然NHibernate默认String类型为nvarchar)。
查阅了《Hibernate2.1.2 Reference 》后,我发现如果不是NHibernate默认映射类型,就必须主动说明物理类型,具体的映射片断如下:
<property name="Content" type="String" >
<column name="Content" sql-type="Text" length="16" />
</property>
问题解决啦。Hibernate / NHibernate作为一个通用的不针对特定数据库的数据持久层框架,还是不可能脱离对数据库特定物理结构的说明,只不过我们在用数据持久化对象的时候就方便多了。
本文介绍了在NHibernate中遇到Text字段映射为String类型时,超过8000字符被截断的问题。通过查阅资料发现,需要在映射文件中明确指定sql-type来解决这个问题,例如将`<property ... type="String" />`改为`<property ... type="String" sql-type="Text" length="16" />`,这样可以确保字符串的完整保存,避免因默认设置导致的数据丢失。
805





