有没有人知道如何在不添加尾随空格的情况下将nhibernate map char(n)列设置为字符串?

时间:2011-12-23 23:03:02

标签: nhibernate

假如你在db中有一个char(5)列并且你有“ABC”,如果你把这个列映射到一个字符串属性,你会发现nhibernate将它映射为“ABC__”,其中下划线代表空格某种(我没有检查它是什么ascii代码)

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

我想我可以尝试修剪设置上的get和padding,但这并不是我最好的解决方案。

那么,是否有一些很好的方法来配置nhibernate以将char(n)列读入字符串而不读取额外的空格?

谢谢!

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

我不确定您使用的是哪个数据库,但我们使用的是iSeries DB2,并且我们在跟踪空格时遇到了同样的问题。我们为" trim"创建了一个自定义用户类型。这些列中的值:TrimmedUser.cs gist

这是有效的,因为iSeries DB2在进行字符串比较时并不考虑尾随空格(即“MYSTRING' equals' MYSTRING'”)。如果您的特定数据库不是这样,那么您可以在" NullSafeSet"中处理它。方法,通过右边填充数据库使用的空白字符。

答案 2 :(得分:0)

这是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);
    }
}