Pourquoi n'est pas mon NHibernate sac collection paramètre 'id parent des enfants de façon dynamique?
J'ai un nouvel objet avec une collection de nouveaux objets à l'intérieur sur certains biens comme un IList. Je vois à travers le générateur de profils sql deux requêtes de type insert être exécuté.. un pour le parent qui a le nouveau guid id, et l'autre pour l'enfant, cependant, la clé étrangère sur l'enfant qui fait référence à la mère, est un vide guid. 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 l'Allié.cs de la classe, j'ai défini BackerEntries propriété
IList<BackerEntry>
Quand j'essaie de SaveOrUpdate le passé dans l'entité-je obtenir les résultats suivants dans le générateur de profils sql:
exec sp_executesql N'INSERT EN Backer (Nom, PostCardSizeId, ItemNumber, BackerId) VALUES (@p0, @p1 @p2, @p3)',N'@p0 nvarchar(3),@p1 de type uniqueidentifier@p2 de type 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 EN BackerEntry (BackerId, BackerEntryTypeId, le Nom, la Description, MaxLength, IsRequired, la Priorité, BackerEntryId) VALUES (@p0, @p1 @p2, @p3, @p4, @p5, @p6, @p7)',N'@p0 uniqueidentifier,@p1 de type uniqueidentifier@p2 de type nvarchar(5),@p3 de type nvarchar(5),@p4 int,@p5 peu,@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'
Comme vous pouvez le voir, ce n'est pas la réinitialisation du vide guid pour BackerId sur l'enfant pour le nouveau guid réel de la mère.
Enfin, l'exception throw 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: RÉSOLU! La première réponse qui m'a orienté dans la bonne direction. J'ai besoin d'ajouter que la référence arrière sur l'enfant de la cartographie et de la classe. Cela a permis de travailler dans un but purement .net façon, cependant, lors de l'acceptation de json, il y avait une déconnexion j'ai donc dû venir avec un peu décalé code pour re-joindre les enfants.
OriginalL'auteur EvilSyn | 2008-09-28
Vous devez vous connecter pour publier un commentaire.
Vous devrez peut-être ajouter NOT-NULL="true" pour votre mappage de classe:
ainsi que assurez-vous que vous avez le revers de la cartographie définie pour la classe enfant:
J'ai eu des problèmes similaires avec mise en veille prolongée sur mon projet actuel, avec les relations parent-enfant, et c'était une partie de la solution.
OriginalL'auteur Elie
J'ai eu ce problème et il m'a fallu une éternité pour le comprendre.
La table Enfant a à autoriser les valeurs null sur celle du parent de clé étrangère.
NHibernate aime pour sauver les enfants avec la valeur NULL dans la colonne de clé étrangère, puis revenir en arrière et de mise à jour avec le bon ParentId.
certainement pas vrai, vous devez mapper une association bidirectionnelle tels que l'inverse de la fin est le parent et définir des propriétés sur les deux côtés. nhforge.org/doc/nh/en/index.html#collections-bidirectional
+1. Oui, c'est vrai. Le FK colonne dans la table enfant doit accepter les valeurs null pour que cela fonctionne. NHibernate ajoute l'enfant avec ParentID valeur NULL et puis les mises à jour de la ParentID lorsque le Parent est en fait enregistré dans la base de données.
OriginalL'auteur RyanL