12

Ho le seguenti mappature:IndexOutOfRangeException profondità nelle viscere della NHibernate

public class SecurityMap : ClassMap<Security> 
    { 
     public SecurityMap() 
     { 
      Table("Security"); 
      CompositeId().KeyProperty(k => k.Id, "SecurityId").KeyProperty(k => k.EndDate); 
      Map(x => x.LastUpdateUser); 
      References(x => x.Company).Columns("CompanyId", "EndDate"); 
      References(x => x.PrimaryListing).Columns("PrimaryListingId", "EndDate"); 
     } 
    } 

public class ListingMap : ClassMap<Listing> 
    { 
     public ListingMap() 
     { 
      Table("Listing"); 
      CompositeId().KeyProperty(k => k.Id, "ListingID").KeyProperty(k => k.EndDate); 
      References(x => x.Security).Columns("SecurityId","EndDate"); 
     } 
    } 

public class CompanyMap : ClassMap<Company> 
    { 
     public CompanyMap() 
     { 
      Table("Company"); 
      CompositeId().KeyProperty(k => k.Id, "CompanyID").KeyProperty(k => k.EndDate); 
      HasMany(x => x.Securities).KeyColumns.Add("CompanyId", "EndDate"); 
     }  
    } 

Quando si tenta di eseguire questo test:

[Test] 
public void can_update_a_security() 
{ 
    var repo = IoC.Resolve<ISecurityRepository>(); 
    int someSecurity = 1; 
    using (var work = IoC.Resolve<IUnitOfWorkManager>().Current) 
    { 
     Security security = repo.Get(someSecurity); 
     security.ShouldNotBeNull(); 
     security.LastUpdateUser = "Dirk Diggler" + DateTime.Now.Ticks; 
     repo.Save(security); 
     work.Commit(); 
    } 
} 

ottengo il seguente errore nel profondo delle viscere di NHibernate:

Esegui System.IndexOutOfRangeException: Indice non valido 6 per questo SqlParameterCollection with Count = 6. a System.Data.SqlClient.SqlParameterCollection.RangeCheck (Int32 indice) a System.Data.SqlClient.SqlParameterCollection.GetParameter (Int32 indice) a System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item (Int32 indice) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Type \ DateTimeType.cs (65,0): a NHibernate.Type.DateTimeType.Set (IDbCommand st, Object value, indice Int32) s : \ NHibernate \ NHibernate \ src \ NHibernate \ Type \ NullableType.cs (180,0): a NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd, Object value, indice Int32) 01.235.s: \ \ NHibernate NHibernate \ src \ NHibernate \ Type \ NullableType.cs (139,0): a NHibernate.Type.NullableType.NullSafeSet (IDbCommand st, Object value, indice Int32, sessione ISessionImplementor) s : \ NHibernate \ NHibernate \ src \ NHibernate \ Type \ ComponentType.cs (213,0): a NHibernate.Type.ComponentType.NullSafeSet (IDbCommand st, Object value, Int32 iniziare, sessione ISessionImplementor) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Persister \ Entity \ AbstractEntityPersister.cs (2393,0): a NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Oggetto id, campo Oggetto [], O bject rowId, booleana [] includeProperty, booleano [] [] includeColumns, tavolo Int32, dichiarazione IDbCommand, sessione ISessionImplementor, indice Int32 ) s: \ NHibernate \ NHibernate \ src \ NHibernate \ persister \ Entity \ AbstractEntityPersister. cs (2754,0): a NHibernate.Persister.Entity.AbstractEntityPersister.Update (Object id, oggetto [] campi, Object [] Oldfields, Object rowId, booleano [] includeProperty, Int32 j, oggetto oldVersion Oggetto Object, SqlCommandInfo sql, sessione ISessionImplementor) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Persister \ Entity \ AbstractEntityP ersister.cs (2666,0): a NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert (Object id, oggetto [] Campi, Object [] Oldfields, Object rowId, booleano [] includeProperty, Int32 j, Object OldVersion, obj Object, SqlCommandInfo sql, sessione ISessionImplementor) s: \ NHibernate \ NHibernate \ src \ NHibernate \ persister \ Entity \ AbstractEntityPersister.cs (2940,0): a NHibernate.Persister.Entity.AbstractEntityPersister.Aggiornamento (Object id, oggetto [] Campi, Int32 [] dirtyFields, booleano hasDirtyCollection, Object [] Oldfields, Object oldVersion, oggetto obj, oggetto rowId, ISessionImplementor sessione) s: \ NHibernate \ NHibernate \ src \ NHibernate \ azione \ EntityUpdateAction.cs (78,0): a NHibernate.Action.EntityUpdateAction.Execute() s: \ NHibernate \ NHibernate \ src \ NHibernate \ Engine \ ActionQueue.cs (130,0): a NHibernate.Engine.ActionQueue.Execute (eseguibile IExecutable ) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Engine \ ActionQueue.cs (113,0): a NHibernate.Engine.ActionQueue.ExecuteActions (IList lista) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Engine \ ActionQueue.cs (147,0): a NHibernate.Engine.ActionQueue.ExecuteActions() s : \ NHibernate \ NHibernate \ src \ NHibernate \ Event \ default \ AbstractFlushingEventListener.cs (241,0): a NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (IEventSource sessione) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Event \ Default \ DefaultFlushEventListener.cs (19,0): allo NHibernate.Event.Default.DefaultFlushEventListener.OnFlush (FlushEvent evento) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Impl \ SessionImpl.cs (1478,0): in NHibernate.Impl.SessionImpl.Flush() s: \ NHibernate \ NHibernate \ src \ NHibernate \ Transaction \ AdoTransaction.cs (187,0): a NHibernate.Transaction.AdoTransaction.Commit() a lambda_method (ExecutionScope, ITransaction)

Ora la cosa interessante è che se io commento il riferimento alla Società o PrimaryListing nel SecurityMap, I don' t ottenere l'errore. Non sembra importare quale commento. L'errore si verifica solo quando ho entrambi.

Quando l'aggiornamento passa in realtà attraverso NHProf mi mostra questo aggiornamento:

UPDATE Security 
SET LastUpdateUser = '2010-02-19T08:09:24.00' /* @p0 */, 
     CompanyId = 54199 /* @p1 */, 
     EndDate = '9999-12-31T00:00:00.00' /* @p2 */ 
WHERE SecurityId = 1 /* @p3 */ 
     AND EndDate = '9999-12-31T00:00:00.00' /* @p4 */ 

io non sono sicuro perché sta aggiornando CompanyID e EndDate, ma ho il sospetto che è correlato.

Qualcuno ha idee? Il lavoro in giro sarebbe molto apprezzato.

+0

sperando che qualcun altro può aggiungere suggerimenti per soluzioni alternative. – NotMyself

+0

L'indice era fuori portata. Deve essere non negativo e inferiore alla dimensione della raccolta. –

risposta

30

Sì, si tratta di un problema comune, si sta utilizzando lo Column "EndDate" due volte nella definizione del mapping (sia per Azienda sia per PrimaryListing) e ciò non è consentito. Uno di loro deve andare, o di avere una colonna DataFine aggiuntiva (uno per ogni associazione)

controllo anche questo nHibernate 2.0 - mapping a composite-id *and* many-to-one relationship causes "invalid index" error

e http://devlicio.us/blogs/derik_whittaker/archive/2009/03/19/nhibernate-and-invalid-index-n-for-this-sqlparametercollection-with-count-n-error.aspx

+2

Sai se questo alla fine sarà risolto? Rende NH inutilizzabile per scenari più complessi che coinvolgono tabelle partizionate ... –

+0

Sembra che questo sia ancora un problema anche con NH 4.0 – leojh

+0

@LeoHernandez questo non è un problema.A tutti gli effetti, se vuoi usare una colonna per più proprietà, allora stai sbagliando – Jaguar

Problemi correlati