【问题标题】:NHibernate Postgresql DateTime to Time ConversionNHibernate Postgresql 日期时间到时间转换
【发布时间】:2011-09-02 00:59:14
【问题描述】:

我正在使用 Fluent NHibernate 配置我的映射,在读取数据时一切正常,但是当尝试插入或更新 Postgresql 类型为 Time 的记录时,我收到错误消息

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

看起来 NHibernate 可能对将 DateTime 转换为哪个 DbType 感到困惑,正如您从 PostgreSQL and C# Datatypes 看到的那样,DateTime 映射到多个 DbType。

我还尝试从 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 实现这一点而我只是做错了什么?

【问题讨论】:

  • 您目前如何将此列映射到您的流利映射中?

标签: .net nhibernate postgresql fluent-nhibernate npgsql


【解决方案1】:

想通了!

显然,我 linked 的转换表要么错误,要么已过时。事实证明,Npgsql 需要一个 System.TimeSpan 对象才能正确转换为 Postgresql“时间”对象。我觉得奇怪的是,他们会尝试将代表两个时间之间差异的东西转换为我们认为的 HH:mm:ss,但事实就是如此。

我没有将我的 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);
}

【讨论】:

    【解决方案2】:

    您可以通过像这样定义映射来解决此问题:

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

    【讨论】:

      【解决方案3】:

      如果您认为 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>();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-04
        相关资源
        最近更新 更多