NHibernate Postgresql DateTime到时间转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NHibernate Postgresql DateTime到时间转换相关的知识,希望对你有一定的参考价值。

我正在使用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可能会混淆哪个DbType将DateTime转换为你可以从PostgreSQL and C# Datatypes看到,有几个DbTypes是DateTime映射到的。

我也尝试从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“time”类型?或者我可以通过IUserType实现这一点,我只是做错了什么?

答案

弄清楚了!

显然,转换表I linked要么是错误的,要么是过时的。事实证明,System.TimeSpan对象是Npgsql正确转换为Postgresql“time”对象所需的对象。我觉得奇怪的是,他们会尝试将代表两个时间之间差异的东西转换成我们认为的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);
}
另一答案

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

Map(x => x.RunTime, "run_time").CustomSqlType("time");
另一答案

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

以上是关于NHibernate Postgresql DateTime到时间转换的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate 似乎没有批量插入 PostgreSQL

Abp.NHibernate连接PostgreSQl数据库

NHibernate Postgresql DateTime到时间转换

如何使用nhibernate / lightcore注册两个数据库连接?

提高 PostgreSQL 查询性能

Fluent Nhibernate将集合映射到通用实体