Кто-нибудь знает, как сделать nhibernate map char (n) столбцов в строку без добавления конечного пробела? - PullRequest
1 голос
/ 24 декабря 2011

Скажем, если у вас есть столбец char (5) в БД, и у вас там есть "ABC", если вы сопоставите этот столбец со строковым свойством, вы обнаружите, что nhibernate отобразит его как "ABC__", где подчеркивания представляют пробел. какой-то (я не проверял, что это за код ascii)

В течение долгого времени мы только что решили эту проблему, изменив столбец на varchar и обрезав все записи в БД. Было бы лучше, если бы существовало решение, позволяющее нам сохранять столбцы как char (n) (хотя бы для того, чтобы сэкономить нам некоторую работу)

Полагаю, я мог бы попытаться обрезать при получении и отступить на съемочной площадке, но это не кажется мне лучшим решением.

Итак, есть ли хороший способ настроить nhibernate для чтения столбца char (n) в строку без его чтения в лишних пробелах?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 24 декабря 2011

Да и нет.Вы можете использовать свойство формулы для тега поля, чтобы установить значение RTrim (myCharField), но тогда оно не будет привязано.То есть любые изменения, внесенные вами в поле, не будут сохранены в базе данных.

Хотя я не понимаю, почему это проблема.Если вы разрабатываете свое приложение с использованием слоя данных, должно быть достаточно просто добавить вызов обрезки в метод получения свойств объекта, прежде чем возвращать его, не так ли?

0 голосов
/ 15 мая 2019

Вот обновленная версия Энди Гиста:

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);
    }
}
0 голосов
/ 06 декабря 2012

Я не уверен, какую базу данных вы используете, но мы используем iSeries DB2, и у нас та же проблема с конечными пробелами. Мы создали пользовательский тип для «обрезки» значений из этих столбцов: TrimmedUser.cs gist

Это работает, потому что iSeries DB2 не учитывает конечные пробелы при сравнении строк (т. Е. «MYSTRING» равно «MYSTRING»). Если это не так для вашей конкретной базы данных, вы, вероятно, могли бы справиться с этим в методе «NullSafeSet», добавив правый пробел с символом пробела, используемым вашей базой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...