2

我正在使用 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 和 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 实现这一点而我只是做错了什么?

4

3 回答 3

4

弄清楚了!

显然,我链接到的转换表是错误的或过时的。事实证明,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);
}
于 2011-05-26T12:22:35.837 回答
0

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

Map(x => x.RunTime, "run_time").CustomSqlType("time");
于 2011-05-25T19:33:00.913 回答
0

如果您认为 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>();
于 2011-05-27T17:13:17.957 回答