有人知道如何使nhibernate将char(n)列映射到字符串而不添加尾随空格吗?

有人知道如何使nhibernate将char(n)列映射到字符串而不添加尾随空格吗?,nhibernate,Nhibernate,假设您在数据库中有一个char(5)列,其中有“ABC”,如果您将此列映射到一个字符串属性,您会发现nhibernate将其映射为“ABC_u;”,其中下划线表示某种类型的空白(我没有检查它是什么ascii代码) 很长一段时间以来,我们只是通过将列更改为varchar并修剪数据库中的所有条目来解决这个问题。如果有一个解决方案让我们将列保留为char(n)(如果只是为了节省一些工作的话)会更好 我想我可以试着在舞台上修剪,在舞台上填充,但这并不是最好的解决办法 那么,有没有什么好方法可以配置nhi

假设您在数据库中有一个char(5)列,其中有“ABC”,如果您将此列映射到一个字符串属性,您会发现nhibernate将其映射为“ABC_u;”,其中下划线表示某种类型的空白(我没有检查它是什么ascii代码)

很长一段时间以来,我们只是通过将列更改为varchar并修剪数据库中的所有条目来解决这个问题。如果有一个解决方案让我们将列保留为char(n)(如果只是为了节省一些工作的话)会更好

我想我可以试着在舞台上修剪,在舞台上填充,但这并不是最好的解决办法

那么,有没有什么好方法可以配置nhibernate将char(n)列读入字符串,而不用读取额外的空白


谢谢

是和否。您可以在字段标记上使用公式属性将值设置为RTrim(myCharField),但这样它就不会被绑定。也就是说,对字段所做的任何更改都不会保存到数据库中


但我真的不明白为什么这是个问题。如果您使用数据层设计应用程序,那么在返回之前向实体属性的getter方法添加一个trim调用应该足够简单,不是吗?

我不确定您使用的是哪个数据库,但我们使用的是iSeries DB2,并且我们在尾部空白处也有同样的问题。我们创建了一个自定义用户类型来“修剪”这些列中的值:


这是因为在执行字符串比较时,iScReDB2不考虑尾随空白(即“MyString”等于“MyString”)。如果您的特定数据库不是这样,您可能可以通过“NullSafeSet”方法处理此问题,方法是用数据库使用的空白字符右键填充。

以下是Andy的要点的更新版本:

public class TrimmedString : NHibernateFactoryType<string>
{
    public override SqlType[] SqlTypes => new[] { new SqlType(DbType.AnsiStringFixedLength) };

    public override object NullSafeGet(DbDataReader rs, string[] names, ISessionImplementor session, object owner)
    {
        var str = (string)NHibernateUtil.String.NullSafeGet(rs, names[0], session);
        return str?.Trim();
    }

    public override void NullSafeSet(DbCommand cmd, object value, int index, ISessionImplementor session)
    {
        value = ((string)value)?.Trim();  //Not really necessary
        NHibernateUtil.String.NullSafeSet(cmd, value, index, session);
    }
}
公共类TrimmedString:NHibernateFactoryType
{
公共重写SqlType[]SqlTypes=>new[]{new SqlType(DbType.AnsiStringFixedLength)};
公共重写对象NullSafeGet(DbDataReader、字符串[]名称、ISessionImplementor会话、对象所有者)
{
var str=(string)NHibernateUtil.string.NullSafeGet(rs,名称[0],会话);
返回str?.Trim();
}
public override void NullSafeSet(DbCommand cmd、对象值、int索引、ISessionImplementor会话)
{
value=((字符串)value)?.Trim();//实际上不需要
NHibernateUtil.String.NullSafeSet(cmd、值、索引、会话);
}
}

get的修剪不够,有时如果将属性读入用户可编辑的字段(如datagridview)中,修剪后的值返回到集合中,如果会话被刷新,无用的update语句get createdI只是在想,我可以确保将进入集合的所有值填充回原来的值,以防止出现这种情况。我只是希望有一种神奇的方式来配置一些东西,使我不必每次都这样做。“如果会话被刷新,将创建无用的更新语句”,除非您的应用程序中存在一些不寻常的情况,其中实体会自动保存(而不是用户单击某些按钮)无用更新的数量将相当少。用户必须打开实体,不做任何更改,然后单击保存。我不相信这种情况经常发生。有时我们制作的网格上有很多条目。其中一个里面有几千件物品。所有无用的更新语句都造成了相当大的延迟。。。我想我们可以围绕这个问题设计屏幕。。但我不想看到那些无用的更新语句。是的,听起来你所要做的只是你不想做的事情。由于所有选项都有点痛苦,我至少建议您选择一个清理数据库的选项(将char字段切换为varchar)