2011-02-03 20 views
27

Ho utilizzato con successo NHibernate per un bel po 'di tempo e sono stati in grado di risolvere molte insidie ​​con un'applicazione che ho sviluppato con esso e che è in esecuzione in produzione. Il recente ostacolo mi ha davvero graffiato la testa, però."L'indice n non valido per questo SqlParameterCollection con Count = n" OR "chiave esterna non può essere nullo"

Recentemente ho dovuto espandere la libreria di classi con alcune nuove classi che sono nidificate come figli ad alcune classi già esistenti. Ho appena copiato lo stesso modello per la mappatura aggregata che utilizzavo già con successo , ma questa volta non funziona.

Ora, quando io uso il seguente nel file di mapping genitore:

<bag name="SeaInfoItems" table="EDIImport_SeaInfo" lazy="false" cascade="save-update"> 
    <key column="EDI_FK_OWNERID"/> 
    <one-to-many class="FargoGate.AppLib.EdiImportSeaInfo, FargoGate.AppLib"/> 
    </bag> 

posso scegliere di, nella classe del bambino, sia per uso:

<property name="EDI_FK_OWNERID" column="EDI_FK_OWNERID" /> 

... che mi dà la infame "Indice n non valido per questo errore SqlParameterCollection con Count = n".

O provo con questa soluzione che ho trovato dopo un po 'Googling:

<property name="EDI_FK_OWNERID" column="EDI_FK_OWNERID" insert="false" update="false" /> 

... che mi ha un "Impossibile inserire il valore NULL nella colonna 'EDI_FK_OWNERID' ... colonna non consente i null dà ". errore.

Quindi in pratica devo scegliere tra parassiti e colera.

Quello che non capisco è che funziona perfettamente per le classi di aggregazione già esistenti e non riesco davvero a individuare la differenza. L'unica cosa è che questa chiave esterna (EDI_FK_OWNERID) potrebbe fare riferimento a due tabelle genitore diverse. Disegno del database errato, lo so, ma non l'ho progettato io, e il mio compito è di svilupparlo nel bene o nel male. Non riesco a cambiare il design del database.

L'altra differenza è che ho rimosso completamente il riferimento alla chiave esterna dalle classi figlio già esistenti (i mapping così come i membri della classe). Ho cercato di emularlo, naturalmente, ma inutilmente.

Inoltre ho scoperto che una delle nuove classi (che è piuttosto piccola) funziona anche bene. Ma non riesco a vedere quale sia la differenza qui. Sono perplesso!

Qualcuno ha un indizio?

+1

in realtà l'indice non valido n ... eccezione che avrebbe portato direttamente a http: // StackOverflow.it/questions/2298026/indexoutofrangeexception-deep-in-the-bowels-of-nhibernate/2311256 # 2311256 – Jaguar

risposta

58

Aaargh! Sono stato messo così tanto su una gamba sbagliata con questo infame "Invalid Index n per questo SqlParameterCollection con Count = n" errore che ho trascurato l'ovvio: una mappatura duplicata di un campo per UNA delle classi. In quel particolare mappatura ho lasciato questo errore, in cui la chiave primaria è anche definito come una proprietà:

<id name="ID" column="ID"> 
    <generator class="guid" /> 
</id> 
<property name="ID" column="ID" /> 

Ora che è stato uno spreco di tempo cercando di eseguire il debug di questo!

+0

+1 per aver sottolineato che potrebbe essere un duplicato in UNA delle classi ... Avevo già risolto questo per il genitore di classe ... dimentica completamente la lezione di un bambino! – PJUK

+0

D'accordo, questo ha aiutato a sapere cosa cercare. Grazie per la condivisione. – Nexxas

+0

Molto più tardi, ma grazie. Sto lavorando anche con database legacy, e ora sto lavorando con una tabella con 45 colonne, e non avevo idea di cosa fosse sbagliato ... e bingo, due proprietà sono state mappate sulla stessa colonna a causa di un errore di copypasta . Grazie! – CMPerez

Problemi correlati