2011-01-21 27 views
2

我們有一個自定義類型,大部分對應於System.Int64,用於我們的系統標識符(它爲底層long值提供了一些額外的約束)。對應於Int64的IUserType使用ODP.net

我們也得到了一個IUserType定義爲允許我們這種類型的特性與NHibernate映射,而是針對Oracle數據庫運行的時候,我們遇到什麼,似乎是被稱爲"Int/Decimal Problem"

的相關部分用戶類型(的get/set)在這裏:

public object NullSafeGet(IDataReader rs, string[] names, object owner) { 
    var longValue = Convert.ToInt64(NHibernateUtil.Int64.NullSafeGet(rs, names[0])); 
    return new Identifier(longValue); 
} 

public void NullSafeSet(IDbCommand cmd, object value, int index) { 
    if (value == null || ((Identifier)value).IsNew) { 
     NHibernateUtil.Int64.NullSafeSet(cmd, null, index); 
     return; 
    } 
    NHibernateUtil.Int64.NullSafeSet(cmd, ((Identifier)value).Value, index); 
} 

試圖挽救任何包含標識屬性時,我們正在充分利用的Isession的SaveOrUpdate方法無效轉換異常。

是否有一種好的(或者甚至是正確的)方式來處理這個問題,這種方式既適用於oracle也適用於SQL服務器,還是需要創建兩個不同的UserType實現?

回答

1

經過一番調查後發現問題可能與sequence-identity generation strategy有關。它試圖用這樣的查詢:

INSERT INTO my_entity (id, name) 
VALUES (hibernate_sequence.nextval, :p0) 
returning id into :nhIdOutParam 

爲了使基於序列的身份工作,同樣將SQL服務器上(允許插入和ID檢索與單個查詢)的方式。我猜測出來的參數是以小數形式出現的,這就是我遇到問題的地方。

切換到「本地」生成策略它正在工作,但我仍然希望聽到關於此的任何其他見解。