为什么 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
)是更好的方法。
当我运行以下代码时:
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
)是更好的方法。