为什么 NHibernate 使用 NVARCHAR 而不是 VARCHAR 忽略列类型映射?

Why NHibernate uses NVARCHAR instead of VARCHAR ignoring column type mapping?

当我运行以下代码时:

List<Dag> result = session.CreateCriteria<Dag>()
            .Add(Expression.Eq("Object_id", pObjectId))
            .List<Dag>().ToList();
}

NHibernate 生成以下 SQL 查询:

exec sp_executesql N'SELECT this_. ... FROM schm.dag this_ WHERE this_.object_id = @p0',N'@p0 nvarchar(4000)',@p0=N'...'

这里的问题是 CAST 到 nvarchar(4000)。 hbm.xml 文件将 object_id 列的映射定义为:

<property name="Object_id" type="String">
  <column name="object_id" not-null="false" length="40" sql-type="varchar" />
</property>

那么为什么 NHibernate 会忽略映射文件中的信息而不使用 varchar(40)?我找不到明确说明用于标准的 属性 类型的方法。我什至不确定我是否需要它,映射在 hbm.xml 文件中,为什么 NHibernate 不拾取它?

这是 NHibernate 4.1.4000 运行在 .Net Framework 4.6(旧版应用程序)上运行。

在您的代码中映射 属性 时:

<property name="Object_id" type="String">

您将 type 指定为 String。改为 AnsiString

请参考 NHibernate Documentation 并在其中搜索“Table 5.3. System.ValueType 映射类型”以获取所有类型的列表。

请注意,在许多考虑到 unicode 支持的情况下,使用 NVARCHAR(因此 string)是更好的方法。