Perché la mia collezione di borse NHibernate non imposta in modo dinamico l '"ID genitore" dei bambini?

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

Domanda

Ho un nuovo oggetto con una raccolta di nuovi oggetti al suo interno su alcune proprietà come IList. Vedo attraverso il profiler sql che vengono eseguite due query di inserimento. Ecco la mia mappatura sul genitore:

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

Nella classe Backer.cs, ho definito la proprietà BackerEntries come

IList<BackerEntry>

Quando provo a SaveOrUpdate l'entità passata ottengo i seguenti risultati nel profiler sql:

exec sp_executesql N'INSERT INTO Backer (Nome, PostCardSizeId, ItemNumber, BackerId) VALORI (@ p0, @ p1, @ p2, @ p3) ', N' @ p0 nvarchar (3), @ p1 uniqueidentifier, @ p2 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 INTO BackerEntry (BackerId, BackerEntryTypeId, Name, Description, MaxLength, IsRequired, Priority, BackerEntryId) VALUES (@ p0, @ p1, @ p2, @ p3, @ p4, @ p5, @ p6, @ p7) ', N' @identificatore univoco @, identificativo univoco @ p1, @ p2 nvarchar (5), @ p3 nvarchar (5), @ p4 int, @ p5 bit, @ 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'

Come puoi vedere, non sta ripristinando la guida vuota per BackerId sul bambino sulla nuova guida reale del genitore.

Infine, il lancio dell'eccezione è:

"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

MODIFICA: RISOLTO! La prima risposta che segue mi ha indicato la direzione corretta. Avevo bisogno di aggiungere quel riferimento posteriore sulla mappatura e sulla classe figlio. Ciò gli ha permesso di funzionare in modo puramente .net - tuttavia, quando si accetta json, c'è stata una disconnessione, quindi ho dovuto trovare un codice bizzarro per "ricollegare" i bambini.

È stato utile?

Soluzione

Potrebbe essere necessario aggiungere NOT-NULL = " true " alla tua classe di mappatura:

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

e assicurati di avere il contrario della mappatura definita per la classe figlio:

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

Ho avuto problemi simili con l'ibernazione sul mio attuale progetto con relazioni genitore-figlio, e questa era una parte della soluzione.

Altri suggerimenti

Ho avuto questo problema e mi ci è voluto un sacco di tempo per capire. La tabella figlio deve consentire null sulla sua chiave esterna padre. A NHibernate piace salvare i bambini con NULL nella colonna chiave esterna e poi tornare indietro e aggiornare con l'ID ParentI corretto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top