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