NHibernate - mapeamento de ID para um DB2 Identidade
-
22-08-2019 - |
Pergunta
Eu sou bastante novo para NHibernate e estou tentando conectar-se a uma tabela DB2 através do provedor iSeries. A tabela tem uma chave primária BIGINT que é auto gerado como uma identidade. Eu tentei vários valores para a propriedade gerador do id no meu arquivo de mapeamento, e não tiveram qualquer sucesso. A aparência da tabela def assim (nomes de campo alterado):
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));
Os olhares arquivo de mapeamento como este:
<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>
No início, eu tinha o conjunto da classe gerador para "nativo", que, de acordo com o documentação , picaretas "identidade" para DB2. Com "nativo" ou "identidade", eu recebo "valores nulos não permitidos em PKID coluna", e vários outros erros quando eu mudar a classe gerador para outros valores.
Eu tenho certeza que há algo pequeno que estou em falta na documentação, mas existe alguma maneira eu posso obter NHibernate para pegar o próximo valor de uma chave primária que é um de identidade gerado no DB2 e manipulá-lo para mim quando eu chamo Save ()? Eu preciso escrever uma algures seleção que NHibernate pode usar para obter o próximo valor?
Agradecemos antecipadamente.
Solução
Eu descobri isso, então se alguém está fazendo esse tipo de coisa no futuro e corre para o mesmo problema, aqui é o que era.
Eu estava usando o tutorial do NHibernate FAQ e adaptá-lo para iSeries. Seguindo-o a um T, I esqueceu de pular a parte que realmente cria o esquema. Eu tive todas as minhas tabelas já criados no ambiente iSeries DB2, então eu não deveria ter feito isso para o meu teste é executado:
<NUnit.Framework.SetUp()> _
Public Sub SetupContext()
Dim schemaExport As New NHibernate.Tool.hbm2ddl.SchemaExport(_configuration)
schemaExport.Execute(False, True, False, False)
End Sub
Especialmente desde que eu tinha o meu arquivo de mapeamento configurado incorretamente para o campo ID, com uma classe geradora de "atribuído". Uma vez que eu olhei para o meu definição de tabela e percebeu que NHibernate tinha substituído o atributo de identidade gerado do PKID campo de chave primária quando SchemaExport.Execute () foi chamado, eu simplesmente recriou a tabela com os atributos corretos, mudou a classe geradora de "identidade, "removido a chamada SchemaExport, e agora tudo funciona perfeitamente.