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
NHibernate Postgresql DateTime到时间转换