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
您可以将它们映射为string或AnsiString.
<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