2009-02-11 66 views
1

我對NHibernate很陌生,試圖通過ISeries提供程序連接到DB2表。該表具有自動生成爲標識的BIGINT主鍵。我已經在我的映射文件中嘗試了id的generator屬性的幾個值,並沒有取得任何成功。表DEF看起來像這樣(字段名稱改變):NHibernate - 將ID映射到DB2身份

CREATE TABLE SCHEMA/TABLE (
    PKID BIGINT GENERATED ALWAYS AS IDENTITY (
     START WITH 1 INCREMENT BY 1 
     NO MINVALUE NO MAXVALUE 
     NO CYCLE NO ORDER 
     CACHE 20) 
    , 
    SOMESTRING VARCHAR(50) CCSID 37 DEFAULT NULL, 
    FIRSTFK BIGINT NOT NULL, 
    SECONDFK BIGINT DEFAULT NULL, 
    ANOTHERSTRING VARCHAR(100) CCSID 37 DEFAULT NULL, 
    CONSTRAINT NISDEV/PK_TABLE PRIMARY KEY (PKID)); 

映射文件是這樣的:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Project.Domain.Thing, Project" table="TABLE"> 
    <id name="ID" column="PKID" type="Int64"> 
     <generator class="**???????**" /> 
    </id> 
    <property name="SomeString" column="SOMESTRING" /> 
    <property name="FirstFK" column="FIRSTFK"/> 
    <property name="SecondFK" column="SECONDFK"/> 
    <property name="AnotherString" column="ANOTHERSTRING"/> 
    </class> 
</hibernate-mapping> 

起初,我有發電機類設置爲「本地人」,其中,根據到documentation,爲DB2選擇「身份」。使用「native」或「identity」,當我將生成器類更改爲其他各種值時,我會得到「列PKID中不允許使用空值」以及各種其他錯誤。

我敢肯定,我在文檔中缺少一些小東西,但是有沒有什麼辦法可以讓NHibernate獲取DB2中一個生成標識的主鍵的下一個值,並處理它我打電話時保存()?我需要在NHibernate可以用來獲取下一個值的地方編寫一個選擇嗎?

在此先感謝。

回答

1

我明白了這一點,所以如果有人在將來做這樣的事情,並遇到同樣的問題,這就是它的原因。

我在使用NHibernate FAQ的教程,並將它改編爲ISeries。在T之後,我忽略了跳過實際創建模式的部分。我把所有的i系列DB2環境已經建立了我的表,所以我不應該這樣做對我的測試運行:

<NUnit.Framework.SetUp()> _ 
Public Sub SetupContext() 
    Dim schemaExport As New NHibernate.Tool.hbm2ddl.SchemaExport(_configuration) 
    schemaExport.Execute(False, True, False, False) 
End Sub 

尤其是因爲我有我的映射文件中設置不正確的ID字段,用發電機類的「分配」。一旦我查看了我的表定義,並意識到NHibernate在調用SchemaExport.Execute()時覆蓋了主鍵字段PKID的GENERATED IDENTITY屬性,我只是用正確的屬性重新創建表,將生成器類更改爲「identity」 「刪除了SchemaExport調用,現在一切正常。