运行 SQL Profiler 后,我意识到 NHibernate 正在将字符串映射到 nvarchar(4000)
。我通过在 hbm 文件中指定 type=AnsiString 和 length=...
修复了该问题。它现在正在生成 varchar(8000)
语句,并且忽略长度。怎么会这样?
hbm 文件:
<property name="EmailAddress" column="EMAIL_ADDRESS" type="AnsiString" length="120" />
数据库字段:
[EMAIL_ADDRESS] [varchar](120) NULL,
最佳答案
实际上,在 nhibernate 的早期版本中,还为查询创建实现了长度检查。
但是,SqlDriver 的当前实现去年发生了变化, 请参阅https://nhibernate.jira.com/browse/NH-3036了解修复的详细信息。
错误修复:
// Used from SqlServerCeDriver as well
public static void SetVariableLengthParameterSize(IDbDataParameter dbParam, SqlType sqlType)
{
SetDefaultParameterSize(dbParam, sqlType);
// no longer override the defaults using data from SqlType, since LIKE expressions needs larger columns
// https://nhibernate.jira.com/browse/NH-3036
//if (sqlType.LengthDefined && !IsText(dbParam, sqlType) && !IsBlob(dbParam, sqlType))
//{
// dbParam.Size = sqlType.Length;
//}
if (sqlType.PrecisionDefined)
{
dbParam.Precision = sqlType.Precision;
dbParam.Scale = sqlType.Scale;
}
}
默认值是您所看到的 (4000/8000),具体取决于数据类型...
关于NHibernate 忽略长度属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20111457/