2012-02-23 60 views
0

我使用Fluent NHibernate作爲ORM層到我的Oracle 10g數據庫,並使用插入前觸發器創建插入記錄時的唯一ID(帶序列)。Int64到NUMBER(18)ID轉換錯誤

-- Within the trigger 
SELECT myseqgen.nextval into :NEW.ID FROM DUAL; 

在代碼中的id屬性是一個長(Int64的)不能轉換成十進制以更好地滿足我們所擁有的數據庫(公共庫)。我已經映射了該如下:

this.Id(x => x.Id, "ID") 
    .CustomSqlType("NUMBER(18)") 
    .CustomType(typeof(IdCustomType)) 
    .GeneratedBy.TriggerIdentity(); 

雖然我已經創造了這個屬性的自定義類型,我不認爲我需要它,因爲在數據庫中,該ID的配置如下:

CREATE TABLE "SOME_SCHEMA"."MY_TABLE" 
    ("ID" NUMBER(18,0), -- 18 means "anything up to 64 bit integer" 
    ... 

但有趣的是,在我的IdCustomType類的NullSafeSet方法中,「value」參數作爲十進制傳遞。

......不僅如此,但在檢查NHProf,插入語句令人擔憂變爲:

INSERT INTO MY_TABLE 
     (COL_ONE, 
     COL_TWO, 
     COL_THREE, 
     COL_FOUR, 
     COL_FIVE, 
     COL_SIX, 
     COL_SEVEN) 
VALUES  ('param one' /* :p0 */, 
     'param two' /* :p1 */, 
     NULL /* :p2 */, 
     'param three' /* :p3 */, 
     TIMESTAMP '2012-01-01 00:00:00.00' /* :p4 */, 
     '22' /* :p5 */, 
     '''81189'' [Type: String (5)], :nhIdOutParam = NULL' /* :p6 */) -- WHAT!? 
returning ID into :nhIdOutParam 

插入語句後,自動選擇我的併發標識的被調用:

SELECT someRow_.CONCURRENCY_COL as CON_2_1_ 
FROM MY_TABLE someRow_ 
WHERE someRow_.ID = 5836738 /* :p0 */ 

沒有發現任何東西。

有沒有人有任何建議?

謝謝, 羅布

+0

您是否檢查過插入成功? – Firo 2012-02-23 16:43:26

回答

0

Oracle使用語法returning ID into :nhIdOutParam到生成的ID放入稱爲nhIdOutParam out參數NH提供給命令來獲取ID其中插入完成後。

+0

但是這個位?我只能看到爲什麼NHibernate生成標準的「81189」,沒有更多...我可以看到爲什麼NHibernate生成標準的「81189」,只有'81189'到「語法,但不是爲什麼它增加了p6的額外信息! – Rob 2012-02-23 17:36:50

+0

也許你看到的輸出是不正確的,因爲它也將out參數寫入查詢中,即使它沒有進入。你是否嘗試過直接向oracle執行生成的select以查看它是否被插入? – Firo 2012-02-24 08:25:26