NHibernate Postgresql преобразование даты в время - PullRequest
2 голосов
/ 25 мая 2011

Я использую Fluent NHibernate для настройки своих сопоставлений, все работает при чтении данных, но при попытке вставить или обновить записи, имеющие тип времени Postgresql, я получаю сообщение об ошибке

"ERROR: 42804: column \"run_time\" is of type time with time zone but expression is of type timestamp without time zone"

Похоже, что NHibernate может быть смущен тем, какой DbType преобразовать DateTime в, как вы можете видеть из PostgreSQL и C # Типы данных , что существует несколько типов DbType, с которыми DateTime сопоставляется.

Iтакже пытался указать пользовательский тип для этого столбца из IUserType, но при переопределении NullSafeSet я получаю NullReferenceError

public override void NullSafeSet(IDbCommand cmd, object value, int index)
{
    var obj = (DateTime)value;

    NHibernate.NHibernateUtil.Time.NullSafeSet(cmd, obj, index);
}

Есть ли какой-либо тип подсказки, которую я могу предоставить, чтобы либо сказать NHibernate для преобразования DateTime в Postgresql "время "типа?Или я могу добиться этого с помощью IUserType, и я просто что-то не так делаю?

Ответы [ 3 ]

4 голосов
/ 26 мая 2011

Разобрался!

Очевидно, что конверсионный лист I , связанный с , неверен или устарел. Оказывается, объект System.TimeSpan - это то, что нужно Npgsql для правильного преобразования в Postgresql «временной» объект. Мне кажется странным, что они пытаются конвертировать что-то, что представляет разницу между двумя временами, в то, что мы считаем ЧЧ: мм: сс, но это так.

Вместо того, чтобы изменить тип моего свойства RunTime с System.DateTime на System.TimeSpan Я вместо этого создал собственный IUserType и переопределил NullSafeSet, чтобы он выглядел как

public override void NullSafeSet(IDbCommand cmd, object value, int index)
{
    var obj = (DateTime)value;

    ((IDbDataParameter) cmd.Parameters[index]).Value = new TimeSpan(0, obj.Hour, obj.Minute, obj.Second);
}
0 голосов
/ 27 мая 2011

Если вы считаете, что NH имеет недопустимые определения для типов данных, вы можете сообщить о них здесь: https://nhibernate.jira.com/browse/NH + тем временем вы можете управлять своим собственным диалектом, чтобы решить это. что-то вроде:

public class CustomDialect : OriginalDialect
{
    public CustomDialect()
    {
      //... add your new definitions here to override default values    
    }
}

теперь вы можете использовать его следующим образом:

var dbType = XyzConfiguration.Standard
                       ...
                       .Dialect<CustomDialect>();
0 голосов
/ 25 мая 2011

Вы можете решить эту проблему, определив свое отображение следующим образом:

Map(x => x.RunTime, "run_time").CustomSqlType("time");
...