您可以将它们映射为string
或AnsiString
。
<property name="MyBigUnicodeColumn" type="string" length="1000000"/>
<property name="MyBigAnsiColumn" type="AnsiString" length="1000000" />
只要长度分别大于 4000 或 8000,NH 就会创建一个 nvarchar(max) 或 varchar(max)。
我可能是该长度用于sql参数并且它被截断为指定的长度(这取决于您使用的NH版本,有一些变化)。所以最好指定它足够大。
编辑:不幸的是,它不适用于 AnsiString 与普通字符串一样。我阅读了一些 NH 代码,发现以下内容:
从 SQL Server 2005 开始,方言支持 varchar(max)。
MsSql2000Dialect.cs,第 205 行
RegisterColumnType(DbType.AnsiString, SqlClientDriver.MaxSizeForLengthLimitedAnsiString, "VARCHAR($l)");
MsSql2005Dialect.cs,第 19 行:
RegisterColumnType(DbType.AnsiString, SqlClientDriver.MaxSizeForAnsiClob, "VARCHAR(MAX)");
当 AnsiString 映射大于 8000 时,它将 varchar(max) 注册为 sql 类型以供选择。
在 SqlClientDriver.cs 中,您可以看到它在参数中为字符串实现了“blob”,但不是为 ansi 字符串(第 135 行):
case DbType.AnsiString:
case DbType.AnsiStringFixedLength:
dbParam.Size = MaxSizeForLengthLimitedAnsiString;
break;
// later on
case DbType.String:
case DbType.StringFixedLength:
dbParam.Size = IsText(dbParam, sqlType) ? MaxSizeForClob : MaxSizeForLengthLimitedString;
break;
它总是将 8000 作为 AnsiString 类型参数的限制。
由于驱动程序和方言之间的不一致,我将其称为错误。
因为该错误发生在所有 AnsiStrings 上,所以在映射中指定 sql 类型无济于事(NH 能够选择正确的 sql 类型)。您需要使用您在 NH 论坛上启动的主题中提出的解决方法:
<property name="MyBigAnsiColumn" type="StringClob" sql-type="VARCHAR(max)" />
我将其报告为错误:https ://nhibernate.jira.com/browse/NH-3252