2008-09-28 23 views
8

J'ai un nouvel objet avec une collection de nouveaux objets en son sein sur une propriété en tant que IList. Je vois à travers sql profiler deux requêtes d'insertion en cours d'exécution .. une pour le parent, qui a le nouvel id guid, et une pour l'enfant, cependant, la clé étrangère sur l'enfant qui référence le parent, est un guid vide. Voici ma carte sur le parent:Pourquoi ma collection de sacs NHibernate ne règle-t-elle pas dynamiquement l'identité parent des enfants?

<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> 

Sur la classe Backer.cs, je définissais la propriété BackerEntries comme

IList<BackerEntry> 

Lorsque je tente de saveOrUpdate le passé dans l'entité que je reçois les résultats suivants dans sql profileur:

exec sp_executesql N'INSERT DANS Backer (Nom, PostCardSizeId, ItemNumber, BackerId) VALEURS (@ p0, @ p1, @ p2, @ p3), N '@ p0 nvarchar (3), @ p1 uniqueidentifier , @ p2 nvarchar (3), @ p3 identifiant unique ', @ p0 = N'qaa', @ p1 = 'BC95E7EB-5EE8-44B2-82FF3 0F5176684D '@ p2 = N'qaa', @ p3 = '18FBF8CE-FD22-4D08-A3B1-63D6DFF426E5'

exec sp_executesql N'INSERT EN BackerEntry (BackerId, BackerEntryTypeId, Nom, Description, MaxLength, IsRequired, priorité , BackerEntryId) VALEURS (@ p0, @ p1, @ p2, @ p3, @ p4, @ p5, @ p6, @ p7) ', N' @ p0 uniqueidentifier, @ p1 uniqueidentifier, @ p2 nvarchar (5), @ p3 nvarchar (5), @ p4 int, @ p5 bits, @ p6 int, @ p7 identificateur unique ', @ 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 '

Comme vous pouvez le voir, il ne réinitialise pas le guid vide pour BackerId sur l'enfant au nouveau guid réel du parent.

Enfin, le jet d'exception est:

"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: RESOLU! La première réponse ci-dessous m'a indiqué la bonne direction. J'avais besoin d'ajouter cette référence arrière sur le mappage de l'enfant et la classe. Cela lui a permis de travailler de manière purement .net - cependant, en acceptant json, il y avait une déconnexion, donc j'ai dû trouver un code original pour "ré-attacher" les enfants.

Répondre

9

Vous devrez peut-être ajouter NOT NULL = « true » à votre classe de cartographie:

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

ainsi que vous assurer que vous avez l'inverse de la cartographie définie pour la classe enfant:

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

J'ai eu des problèmes similaires avec hibernate sur mon projet actuel avec des relations parent-enfant, et cela faisait partie de la solution.

+0

Merci .. Vous m'a indiqué dans la bonne direction ... Je n'avais pas la référence arrière dans ma cartographie enfantine. – EvilSyn

0

J'ai eu ce problème et il m'a fallu une éternité pour comprendre. La table enfant doit autoriser les valeurs NULL sur sa clé étrangère parent. NHibernate aime enregistrer les enfants avec NULL dans la colonne clé étrangère, puis revenir en arrière et mettre à jour avec le ParentId correct.

+1

Est-ce vrai ??? – Dan

+1

certainement pas vrai, vous devez mapper une association bidirectionnelle telle que la fin inverse est la parent et définir les propriétés des deux côtés. http://www.nhforge.org/doc/nh/en/index.html#collections-bidirectional – dotjoe

+0

+1. Oui c'est vrai. La colonne FK dans la table enfant doit être nullable pour que cela fonctionne.NHibernate ajoute l'enfant avec ParentID défini à NULL, puis met à jour ParentID lorsque Parent est réellement enregistré dans la base de données. –