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.
espérant que quelqu'un peut ajouter les autres suggestions pour des solutions de contournement. – NotMyself
L'index était hors de portée. Doit être non négatif et inférieur à la taille de la collection. –