NHibernate 忽略长度属性

标签 nhibernate nhibernate-mapping

运行 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/

相关文章:

NHibernate session (和无状态 session )和长时间运行的应用程序

nhibernate - 复杂对象的 Fluent NHibernate N+1 问题

nhibernate - 多态 NHibernate 映射

nhibernate - 为什么是 Fluent NHibernate 与 hbm XML 文件?

nhibernate - 如何使用一些初始化字段(Id 除外)创建 NHibernate 代理对象?

session 关闭后,nhibernate 不会释放内存

nhibernate - 异常 "instance was not in a valid state"

c# - 流畅的 NHibernate 多实体关系映射

nhibernate - FluentNHibernate和NHibernate的 “Mapping by Code”之间的区别

c# - Cascade.All() EXCEPT Delete 是否有可能?