12

Je les applications suivantes:IndexOutOfRangeException dans les entrailles de 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"); 
     }  
    } 

Lorsque je tente de lancer ce 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(); 
    } 
} 

Je reçois l'erreur suivante dans les entrailles de NHibernate:

Exécuter System.IndexOutOfRangeException: index non valide 6 pour cette SqlParameterCollection avec Count = 6. à System.Data.SqlClient.SqlParameterCollection.RangeCheck (indice Int32 ) à System.Data.SqlClient.SqlParameterCollection.GetParameter (Int32 Index ) à System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item (Int32 index) s : \ NHibernate \ NHibernate \ src \ NHibernate \ type \ DateTimeType.cs (65,0): à NHibernate.Type.DateTimeType.Set (IDbCommand st, la valeur de l'objet, l'indice int32) s : \ NHibernate \ NHibernate \ src \ NHibernate \ Type \ NullableType.cs (180,0): à NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd, Valeur d'objet, index Int32) s: \ \ NHibernate NHibernate \ src \ \ NHibernate type \ NullableType.cs (139,0): à NHibernate.Type.NullableType.NullSafeSet (IDbCommand st, la valeur de l'objet, l'indice Int32, séance ISessionImplementor) s : \ NHibernate \ NHibernate \ src \ NHibernate \ type \ ComponentType.cs (213,0): à NHibernate.Type.ComponentType.NullSafeSet (IDbCommand st, la valeur de l'objet, Int32 commencer, séance ISessionImplementor) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Persister \ Entité \ AbstractEntityPersister.cs (2393,0): à NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (objet id, objet [] champs, O bjet rowId, Boolean [] includeProperty, Boolean [] [] includeColumns, table Int32, déclaration IDbCommand, séance ISessionImplementor, index Int32 ) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Persister \ Entité \ AbstractEntityPersister. cs (2754,0): à NHibernate.Persister.Entity.AbstractEntityPersister.Update (Object id, objet [] champs, Object [] Oldfields, objet rowId, Boolean [] includeProperty, Int32 j, objet ancienneversion , Obj objet, SqlCommandInfo sql, session ISessionImplementor) s: \ NHibernate \ NHibernate \ src \ NHibernate \ persister \ Entity \ AbstractEntityP ersister.cs (2666,0): à NHibernate.Persister.Entity.AbstractEntityPersister.UpdateOrInsert (Object id, Object [] champs, Object [] Oldfields, objet rowId, Boolean [] includeProperty, Int32 j, objet ancienneversion, objet obj, SqlCommandInfo sql, séance ISessionImplementor) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Persister \ Entité \ AbstractEntityPersister.cs (2940,0): à NHibernate.Persister.Entity.AbstractEntityPersister.Mise à jour (Object id, Object [] champs, Int32 [] dirtyFields, Boolean hasDirtyCollection, Object [] Oldfields, objet ancienneversion, objet obj, objet rowId, ISessionImplementor session) s: \ NHibernate \ NHibernate \ src \ NHibernate \ action \ EntityUpdateAction.cs (78,0): à NHibernate.Action.EntityUpdateAction.Execute() s: \ NHibernate \ NHibernate \ src \ NHibernate \ Engine \ ActionQueue.cs (130,0): à NHibernate.Engine.ActionQueue.Execute (IExecutable exécutable) s: \ NHibernate \ NHibernate \ src \ NHibernate \ moteur \ ActionQueue.cs (113,0): à NHibernate.Engine.ActionQueue.ExecuteActions (liste IList ) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Engine \ ActionQueue.cs (147,0): à NHibernate.Engine.ActionQueue.ExecuteActions() s : \ NHibernate \ NHibernate \ src \ NHibernate \ Event \ Default \ AbstractFlushingEventListener.cs (241,0): à NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (IEventSource session) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Evénement \ Par défaut \ DefaultFlushEventListener.cs (19,0): à NHibernate.Event.Default.DefaultFlushEventListener.OnFlush (Evénement FlushEvent ) s: \ NHibernate \ NHibernate \ src \ NHibernate \ Impl \ SessionImpl.cs (1478,0): à NHibernate.Impl.SessionImpl.Flush() s: \ NHibernate \ NHibernate \ src \ NHibernate \ Transaction \ AdoTransaction.cs (187,0): à NHibernate.Transaction.AdoTransaction.Commit() à lambda_method (ExecutionScope, ITransaction)

maintenant la chose intéressante est de savoir si je commente la référence à la société ou PrimaryListing dans le SecurityMap, je n » t obtenir l'erreur. Cela ne semble pas important ce que je commente. L'erreur ne se produit que lorsque j'ai les deux.

Lorsque la mise à jour se fait par le biais NHProf me montre cette mise à jour:

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

Je ne sais pas pourquoi il est mise à jour et COMPANYID EndDate, mais je pense qu'il est lié.

Quelqu'un a des idées? Les travaux seraient grandement appréciés.

+0

espérant que quelqu'un peut ajouter les autres suggestions pour des solutions de contournement. – NotMyself

+0

L'index était hors de portée. Doit être non négatif et inférieur à la taille de la collection. –

Répondre

30

Oui, c'est un problème commun, vous utilisez le Column "EndDate" deux fois dans votre définition de mappage (pour Société et PrimaryListing) et ce n'est pas autorisé. L'un d'eux doit aller ou avoir une colonne EndDate supplémentaire (un pour chaque association)

à cocher cela aussi nHibernate 2.0 - mapping a composite-id *and* many-to-one relationship causes "invalid index" error

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

+2

Savez-vous si cela sera éventuellement corrigé? Il rend NH inutilisable pour des scénarios plus complexes impliquant des tables partitionnées ... –

+0

Il semble que ce soit encore un problème même avec NH 4.0 – leojh

+0

@LeoHernandez ce n'est pas un problème.Pour toutes fins utiles, si vous souhaitez utiliser une colonne pour plusieurs propriétés, alors vous le faites mal – Jaguar

Questions connexes