Por que minha coleção saco NHibernate não está definindo o 'id pai' dos filhos dinamicamente?

StackOverflow https://stackoverflow.com/questions/146604

Pergunta

Eu tenho um novo objeto com uma coleção de novos objetos dentro dele em alguma propriedade como um IList. Eu vejo através profiler sql duas consultas de inserção que está sendo executado .. um para o pai, que tem o novo ID de guid, e um para a criança, no entanto, a chave estrangeira sobre a criança que as referências do pai, é um guid vazio. Aqui está o meu mapeamento sobre o pai:

<id name="BackerId">
  <generator class="guid" />
</id>
<property name="Name" />
<property name="PostCardSizeId"  />
<property name="ItemNumber" />

<bag name="BackerEntries" table="BackerEntry" cascade="all" lazy="false" order-by="Priority">
  <key column="BackerId" />
  <one-to-many class="BackerEntry" />
</bag> 

Na classe Backer.cs, I definido BackerEntries propriedade como

IList<BackerEntry>

Quando tento saveOrUpdate o passado na entidade recebo os seguintes resultados no profiler sql:

exec sp_executesql N'INSERT INTO Backer (Nome, PostCardSizeId, ItemNumber, BackerId) VALUES (@ p0, @ p1, p2 @, @ P3) 'N' @ p0 nvarchar (3), @ p1 uniqueidentifier, @ p2 nvarchar (3), @ p3 uniqueidentifier '@ p0 = N'qaa', @ p1 = 'BC95E7EB-5EE8-44B2-82FF30F5176684D', @ p2 = N'qaa', @ p3 = '18FBF8CE-FD22-4D08-A3B1-63D6DFF426E5'

exec sp_executesql N'INSERT INTO BackerEntry (BackerId, BackerEntryTypeId, nome, descrição, MaxLength, IsRequired, Prioridade, BackerEntryId) VALUES (@ p0, @ p1, p2 @, @ P3, P4 @, @ p5, @ P6, @ p7) 'N '@ p0 uniqueidentifier, @ p1 uniqueidentifier, @ p2 nvarchar (5), @ p3 nvarchar (5), @ P4 int, @ p5 pouco, @ p6 int, @ p7 uniqueidentifier', @ p0 =' 00000000-0000-0000-0000-000000000000' , @ p1 = '2C5BDD33-5DD3-42EC-AA0E-F1E548A5F6E4', @ p2 = N'qaadf '@ p3 = N'wasdf', @ P4 = 0, @ p5 = 1, @ P6 = 0, @ p7 = 'FE9C4A35-6211-4E17-A75A-60CCB526F1CA'

Como você pode ver, não é redefinir o guid vazio para BackerId sobre a criança para o novo guid real do pai.

Finalmente, o lance exceção é:

"NHibernate.Exceptions.GenericADOException: could not insert: [CB.ThePostcardCompany.MiddleTier.BackerEntry][SQL: INSERT INTO BackerEntry (BackerId, BackerEntryTypeId, Name, Description, MaxLength, IsRequired, Priority, BackerEntryId) VALUES (?, ?, ?, ?, ?, ?, ?, ?)] ---\u003e System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint

EDIT: RESOLVIDO! A primeira resposta abaixo apontou-me na direção correta. Eu precisava para adicionar essa referência para trás sobre o mapeamento criança e classe. Isto permitiu-lhe trabalhar de uma forma puramente .net - no entanto, ao aceitar json, houve uma desconexão então eu tive que vir para cima com algum código peculiar para 're-anexar' as crianças

.
Foi útil?

Solução

Você pode precisar adicionar not-null = "true" para sua classe de mapeamento:

<bag name="BackerEntries" table="BackerEntry" cascade="all" lazy="false" order-by="Priority">
  <key column="BackerId" not-null="true"/>
  <one-to-many class="BackerEntry" />
</bag>

, bem como certificar-se de que você tem o reverso do mapeamento definido para a classe infantil:

<many-to-one name="parent" column="PARENT_ID" not-null="true"/>

Eu tive problemas semelhantes com hibernate no meu projeto atual com relações pai-filho, e esta foi uma parte da solução.

Outras dicas

Eu tive esse problema e ele me levou uma eternidade para descobrir. A tabela a criança tem que permitir nulos nele pai de chave estrangeira. NHibernate gosta de salvar as crianças com NULL na coluna de chave estrangeira e, em seguida, voltar e atualização com o ParentId correta.

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