我对NHibernate很新,并试图通过ISeries提供程序连接到DB2表。该表有一个BIGINT主键,它作为标识自动生成。我已经在我的映射文件中尝试了id的generator属性的几个值,并且没有取得任何成功。表def看起来像这样(字段名称已更改):
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>
首先,我将生成器类设置为“native”,根据documentation,选择DB2的“identity”。使用“native”或“identity”,我得到“列PKID中不允许空值”,以及当我将生成器类更改为其他各种值时的各种其他错误。
我确信文档中缺少一些小东西,但有没有办法让NHibernate获取DB2中生成IDENTITY的主键的下一个值并为我处理它当我调用Save()?我是否需要在NHibernate可以用来获取下一个值的地方写一个选择?
提前致谢。
答案 0 :(得分:1)
我想到了这一点,所以如果有人在将来做这类事情并遇到同样的问题,那就是它的本质。
我正在使用NHibernate FAQ中的教程并将其调整为ISeries。跟着它到T,我忽略了跳过实际创建模式的部分。我已经在ISeries 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调用,现在一切正常。