2011-05-25 54 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>();