NHibernate Postgresql DateTime到时间转换

问题描述 投票:2回答:3

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

.net nhibernate postgresql fluent-nhibernate npgsql
3个回答
4
投票

弄清楚了!

显然,转换表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);
}

0
投票

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

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

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>();
© www.soinside.com 2019 - 2024. All rights reserved.