Warum ist meine nicht NHibernate Taschenkollektion Einstellung der ‚Mutter id‘ der dynamisch Kinder?

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

Frage

Ich habe ein neues Objekt mit einer Sammlung von neuen Objekten in ihn auf einer Eigenschaft als IList. Ich sehe durch SQL Profiler zwei Insert-Abfragen ausgeführt werden .. ein für die Eltern, die den neuen GUID-ID hat, und einen für das Kind, aber die Fremdschlüssel auf dem Kind, das die Eltern verweist, ist eine leere guid. Hier ist meine Zuordnung auf dem 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> 

Auf der Backer.cs Klasse I definiert BackerEntries Eigenschaft als

IList<BackerEntry>

Wenn ich versuche, die in Einheit weitergegeben SaveOrUpdate ich die folgenden Ergebnisse in SQL Profiler:

exec sp_executesql N'INSERT INTO Backer (Name, PostCardSizeId, ItemNumber, BackerId) VALUES (@ p 0, @ p1, @ p2, @ p3) 'N' @ p0 nvarchar (3), @ p1 unique, @ p2 nvarchar (3), @ p3 unique '@ 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, Name, Beschreibung MaxLength, IsRequired, Priorität, BackerEntryId) VALUES (@ p 0, @ p1, @ p2, p3 @, @ p4, p5 @, @ p6, @ p7) 'N '@ p0 UNIQUE, @ p1 UNIQUE, @ p2 nvarchar (5), @ p3 nvarchar (5), @ p4 int, @ p5 bit, @ p6 int, @ p7 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'

Wie Sie sehen, es ist nicht das leere guid für BackerId Zurücksetzen auf das Kind auf den neuen realen guid des Mutter.

Schließlich ist die Ausnahme throw ist:

"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 wies mich in die richtige Richtung. Ich brauchte das zurück Bezug auf das Kind-Mapping und Klasse hinzuzufügen. Dies erlaubte es in einem rein .net Weg zur Arbeit - aber wenn json zu akzeptieren, da eine Trennung war so ich mit einigen skurrilen Code ‚wieder anbringen‘ die Kinder aufzukommen hatte

.
War es hilfreich?

Lösung

Sie müssen möglicherweise NICHT-NULL = "true", um Ihre Mapping-Klasse hinzufügen:

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

als auch sicherstellen, dass Sie die Rückseite des Mapping definiert für das Kind Klasse haben:

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

Ich hatte ähnliche Probleme mit Hibernate auf meinem aktuelles Projekt mit Eltern-Kind-Beziehungen, und dies war ein Teil der Lösung.

Andere Tipps

hatte ich dieses Problem und es hat mich für immer, um herauszufinden. Der Kindertisch hat nulls zu ermöglichen, sich auf sie Eltern Fremdschlüssel ist. NHibernate mag die Kinder mit NULL in der Fremdschlüsselspalte speichern und dann mit dem richtigen ParentId zurückgehen und aktualisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top