.net NHibernate Postgresql日期时间转换
我使用Fluent 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
“错误: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映射中映射此列?