Pourquoi ma collection de sacs NHibernate ne définit-elle pas de manière dynamique le "parent id" des enfants?

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

Question

J'ai un nouvel objet contenant une collection de nouveaux objets sur certaines propriétés en tant qu'IList. Je vois à travers le profileur SQL que deux requêtes d'insertion sont en cours d'exécution. L'une pour le parent, qui a le nouvel ID de guidage, et l'autre pour l'enfant. Cependant, la clé étrangère de l'enfant qui référence le parent est un guid vide. Voici ma cartographie sur le parent:

<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, j'ai défini la propriété BackerEntries comme

IList<BackerEntry>

Lorsque j'essaie de sauvegarder l'entité passée dans SaveOrUpdate, les résultats suivants apparaissent dans le profileur SQL:

exec sp_executesql N'INSERT INTO Contributeur (Nom, PostCardSizeId, ItemNumber, BackerId) VALEURS (@ p0, @ p1, @ p2, @ p3) ', N' @ p0 nvarchar (3), @ p1 identificateur unique, @ p2 nvarchar (3), @ p3 uniqueidentifier ', @ p0 = N'qaa', @ p1 = 'BC95E7EB-5EE8-44B2-82FF30F5176684D', @ p2 = N'qaa ', @ p3 =' 18FBF8CE-FD22-4D08-A3B1-63DFF426E5 '

exec sp_executesql N'INSERT INTO BackerEntry (BackerId, BackerEntryTypeId, Nom, Description, Longueur maximale, Exige, Priorité, Priorité, BackerEntryId) VALEURS (@ p0, @ p1, @ p2, @ p3, @ p4, @ p4, @ p4, @ p4, @ p4, @ p7) ', N' @ p0 identifiant unique, @ p1 identifiant unique, @ p2 nvarchar (5), @ p3 nvarchar (5), @ p4 int, @ p5 bits, @ p6 int, @ p7 identifiant 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 constater, il ne réinitialise pas le guide vide de BackerId sur l'enfant au nouveau guide 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 orienté dans la bonne direction. J'avais besoin d'ajouter cette référence en arrière sur le mappage et la classe des enfants. Cela lui a permis de fonctionner de manière purement .net. Cependant, lors de l'acceptation de JSON, il y avait une déconnexion, il a donc fallu que je trouve un code original pour "rattacher" les enfants.

Était-ce utile?

La solution

Vous devrez peut-être ajouter NOT-NULL = " true " à votre classe de mappage:

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

et assurez-vous que vous avez l'inverse du mappage défini 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.

Autres conseils

J'ai eu ce problème et il m'a fallu une éternité pour le résoudre. La table Child doit autoriser les valeurs NULL sur la clé étrangère de son parent. NHibernate aime sauvegarder les enfants avec NULL dans la colonne de clé étrangère, puis revenir en arrière et mettre à jour avec le bon ParentId.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top