如何在NHibernate hbm.xml映射文件中映射VARCHAR(MAX)列

Phi*_*den 16 nhibernate nhibernate-mapping

我们有一个带有varchar和nvarchar max列的SQL Server表,如下所示:

CREATE TABLE [dbo].[MyTable](
  :
  [MyBigUnicodeColumn] [nvarchar](max) NULL,
  [MyBigAnsiColumn]    [varchar](max) NULL,
  :
Run Code Online (Sandbox Code Playgroud)

在创建映射(hbm.xml)文件时,文档说使用StringClob作为数据库类型为DbType.String的大对象的type属性,但它没有说明如果数据库类型是DbType.AnsiString该怎么办.

<class name="MyTable" table="MyTable" lazy="false">
  :
  <property name="MyBigUnicodeColumn" type="StringClob" />
  <property name="MyBigAnsiColumn" type="????" />
  :
Run Code Online (Sandbox Code Playgroud)

这适用于NHibernate 3.3.1.

Ste*_*ger 23

您可以将它们映射为stringAnsiString.

<property name="MyBigUnicodeColumn" type="string" length="1000000"/>
<property name="MyBigAnsiColumn" type="AnsiString" length="1000000" />
Run Code Online (Sandbox Code Playgroud)

每当长度分别大于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)");
Run Code Online (Sandbox Code Playgroud)

MsSql2005Dialect.cs,第19行:

RegisterColumnType(DbType.AnsiString, SqlClientDriver.MaxSizeForAnsiClob, "VARCHAR(MAX)");
Run Code Online (Sandbox Code Playgroud)

它将varchar(max)注册为sql类型,以便在AnsiString映射大于8000时进行选择.

在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;
Run Code Online (Sandbox Code Playgroud)

它总是将8000作为AnsiString类型参数的限制.

由于司机和方言之间的不一致,我称之为一个错误.

因为错误发生在所有AnsiStrings上,所以在映射中指定sql-type没有帮助(NH能够选择正确的sql类型).您需要使用您在NH论坛上开始主题中提出的解决方法:

<property name="MyBigAnsiColumn" type="StringClob" sql-type="VARCHAR(max)" /> 
Run Code Online (Sandbox Code Playgroud)

我把它报告为一个错误:https://nhibernate.jira.com/browse/NH-3252