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

标签 nhibernate nhibernate-mapping

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

CREATE TABLE [dbo].[MyTable](
  :
  [MyBigUnicodeColumn] [nvarchar](max) NULL,
  [MyBigAnsiColumn]    [varchar](max) NULL,
  :


创建映射(hbm.xml)文件时,documentation表示将StringClob用作数据库类型为DbType.String的大型对象的类型属性,但没有说明如果数据库类型为DbType怎么办.AnsiString。

<class name="MyTable" table="MyTable" lazy="false">
  :
  <property name="MyBigUnicodeColumn" type="StringClob" />
  <property name="MyBigAnsiColumn" type="????" />
  :


这适用于NHibernate 3.3.1。

最佳答案

您可以将它们映射为stringAnsiString

<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中,您可以看到它在params中为字符串实现了“ 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类型的参数的限制。

由于驱动程序和方言之间的不一致,我将其称为错误。

由于该错误发生在所有AnsiString上,因此在映射中指定sql类型无济于事(NH能够选择正确的sql类型)。您需要使用thread you started on the NH forum中建议的解决方法:

<property name="MyBigAnsiColumn" type="StringClob" sql-type="VARCHAR(max)" /> 




我将其报告为错误:https://nhibernate.jira.com/browse/NH-3252

关于nhibernate - 如何在NHibernate hbm.xml映射文件中映射VARCHAR(MAX)列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12105929/

相关文章:

c# - 扩展 Nhibernate 以在获取或映射中使用 "inner remote join"

c# - NHibernate ICriteria - 排序是否允许空值?

asp.net-mvc - 在 MVC 应用程序中配置 NHibernate 二级缓存

fluent-nhibernate - 在流畅的nhibernate中设置复合键属性的类型和长度

.net - 为 POINT postgresql 数据类型(或非原始类似 nhibernate 类型的任何 COLUMN)实现新的 NHibernate 类型

NHibernate 自定义集合类型

c# - N-Hibernate 中的长字符串与 Oracle 导致错误

c# - 如何使用 Spring.Net 设置 NHibernate 以使用无状态 session ?

NHibernate LazyInitializationException .. 如何防止?

c# - NHibernate 一对一映射