NHibernate Postgresql DateTime到时间转换

时间:2011-05-25 19:11:01

标签: .net nhibernate postgresql fluent-nhibernate npgsql

我正在使用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看到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“time”类型?或者我可以通过IUserType实现这一点,我只是做错了什么?

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

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

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

答案 2 :(得分: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>();