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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top