2011-05-25 51 views
2

我使用功能NHibernate读取数据时,需要配置我的映射一切正常,但试图插入或具有PostgreSQL类型时间更新记录我得到的错误消息时NHibernate的PostgreSQL的日期时间,以时间转换

"ERROR: 42804: column \"run_time\" is of type time with time zone but expression is of type timestamp without time zone"

它看起来像NHibernate可能会混淆在哪个DbType将日期时间转换为,你可以从PostgreSQL and C# Datatypes看到,有几个日期时间映射到的DbTypes。

我也试过指定自定义类型从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的,以日期时间转换Postgresql的“时间”类型?或者我可以通过IUserType实现这一点,我只是做错了什么?

+0

你如何目前已此列在你的流利的映射映射? – 2011-05-25 19:20:40

回答

4

想通了!

显然转换表我linked是错误的或过时的。事实证明,一个System.TimeSpan对象是Npgsql对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); 
} 
0

您可能能够通过定义这样你的映射来解决这个问题:

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

我也试过这个......虽然谢谢 – 2011-05-26 12:18:07

0

我的runtime属性的类型,如果你认为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>();