Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net NHibernate Postgresql日期时间转换_.net_Nhibernate_Postgresql_Fluent Nhibernate_Npgsql - Fatal编程技术网

.net NHibernate Postgresql日期时间转换

.net NHibernate Postgresql日期时间转换,.net,nhibernate,postgresql,fluent-nhibernate,npgsql,.net,Nhibernate,Postgresql,Fluent Nhibernate,Npgsql,我使用Fluent NHibernate来配置映射读取数据时一切正常,但当尝试插入或更新具有Postgresql类型时间的记录时,我会收到错误消息 “错误:42804:列\“运行时间\”的类型为带时区的时间,但表达式的类型为不带时区的时间戳” 看起来NHibernate可能会混淆将DateTime转换为哪个数据库类型,从中可以看出DateTime映射到几个数据库类型 我还尝试从IUserType为此列指定自定义类型,但在NullSafeSet覆盖上,我得到一个NULLREFERENCETERRO

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

“错误:42804:列\“运行时间\”的类型为带时区的时间,但表达式的类型为不带时区的时间戳”

看起来NHibernate可能会混淆将DateTime转换为哪个数据库类型,从中可以看出DateTime映射到几个数据库类型

我还尝试从IUserType为此列指定自定义类型,但在NullSafeSet覆盖上,我得到一个NULLREFERENCETERROR

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

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

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

显然,转换表I是错误的或过时的。事实证明,Npgsql需要System.TimeSpan对象才能正确转换为Postgresql“time”对象。我觉得奇怪的是,他们试图将代表两个时间之间差异的东西转换成我们认为的HH:mm:ss,但事实就是这样

我没有将运行时属性的类型从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);
}

如果您认为NH的数据类型定义无效,可以在此处报告: +与此同时,你可以用自己的方言来解决这个问题。比如:

public class CustomDialect : OriginalDialect
{
    public CustomDialect()
    {
      //... add your new definitions here to override default values    
    }
}
现在您可以这样使用它:

var dbType = XyzConfiguration.Standard
                       ...
                       .Dialect<CustomDialect>();
var dbType=XyzConfiguration.Standard
...
.方言();

您当前如何在fluent映射中映射此列?