Ich habe ein neues Objekt mit einer Sammlung neuer Objekte darin auf einer Eigenschaft als IList. Ich sehe durch SQL Profiler zwei Insert-Abfragen ausgeführt werden .. eine für die Eltern, die die neue GUID-ID hat, und eine für das Kind, jedoch der Fremdschlüssel auf das Kind, das auf die Eltern verweist, ist eine leere GUID. Hier ist meine Zuordnung auf dem parent:Warum legt meine NHibernate-Taschenkollektion die Eltern-ID der Kinder nicht dynamisch fest?
<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>
Auf der Backer.cs Klasse I definiert BackerEntries Eigenschaft als
IList<BackerEntry>
Wenn ich versuche, die in Einheit weitergegeben SaveOrUpdate erhalte ich die folgenden Ergebnisse in SQL Profiler:
exec sp_executesql N'INSERT INTO Backer (Name, PostCardSizeId, ItemNumber, BackerId) VALUES (@ p0, p1 @, @ p2, p3 @) 'N' @ p0 nvarchar (3), p1 @ UNIQUE , @ p2 nvarchar (3), @ p3 eindeutige Kennung ', @ p0 = N'qaa', @ p1 = 'BC95E7EB-5EE8-44B2-82FF3 0F5176684D '@ p2 = N'qaa', @ p3 = '18FBF8CE-FD22-4D08-A3B1-63D6DFF426E5'
exec sp_executesql N'INSERT INTO BackerEntry (BackerId, BackerEntryTypeId, Name, Beschreibung MaxLength, IsRequired, Priorität , BackerEntryId) WERTE (@ p0, @ p1, @ p2, @ p3, @ p4, @ p5, @ p6, @ p7) ', N' @ p0 eindeutige Kennung, @ p1 eindeutige Kennung, @ p2 nvarchar (5), @ p3 nvarchar (5), @ p4 int, @ p5 bit, @ p6 int, @ p7 eindeutige Kennung ', @ 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 '
Wie Sie sehen können, wird die leere GUID für BackerId des untergeordneten Elements nicht auf die neue echte GUID des übergeordneten Elements zurückgesetzt.
Schließlich ist die Ausnahme Wurf:
"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: GELÖST! Die erste Antwort unten zeigte mir die richtige Richtung. Ich musste diese Rückreferenz für das Kind-Mapping und die Klasse hinzufügen. Dies ermöglichte, dass es auf eine rein .net-Weise funktioniert - jedoch, als ich json annahm, gab es eine Trennung, also musste ich mir einen skurrilen Code einfallen lassen, um die Kinder wieder anzubringen.
Vielen Dank .. Sie haben mich in die richtige Richtung gezeigt ... Ich hatte nicht die Zurück-Referenz in meinem Kind Mapping. – EvilSyn