isessionfactory info fluently nhibernate exception fluent-nhibernate nhibernate-mapping mapping

info - nhibernate download c#



IndexOutOfRangeException Profundamente en las entraƱas de NHibernate (1)

Tengo las siguientes asignaciones:

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"); } }

Cuando intento ejecutar esta prueba:

[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(); } }

Recibo el siguiente error en las entrañas de NHibernate:

Ejecute System.IndexOutOfRangeException: índice 6 no válido para este SqlParameterCollection con Count = 6. en System.Data.SqlClient.SqlParameterCollection.RangeCheck (índice Int32) en System.Data.SqlClient.SqlParameterCollection.GetParameter (índice Int32) en System.Data.Common.DbParameterCollection.System.Collections.IList.get_Item (índice Int32) s: / NHibernate / NHibernate / src / NHibernate / Type / DateTimeType.cs (65,0): en NHibernate.Type.DateTimeType.Set (IDbCommand st, valor del objeto, índice Int32) s: / NHibernate / NHibernate / src / NHibernate / Type / NullableType.cs (180,0): en NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd, valor del objeto, índice Int32) s: / NHibernate / NHibernate / src / NHibernate / Type / NullableType.cs (139,0): en NHibernate.Type.NullableType.NullSafeSet (IDbCommand st, Object value, Int32 index, ISessionImplementor session) s: / NHibernate / NHibernate / src / NHibernate / Type / ComponentType.cs (213,0): en NHibernate.Type.ComponentType. NullSafeSet (IDbCommand st, valor del objeto, Int32 begin, ISessionImplementor session) s: / NHibernate / NHibernate / src / NHibernate / Persister / Entity / AbstractEntityPersister.cs (2393,0) : en NHibernate.Persister.Entity.AbstractEntityPersister.Dehydrate (Object id, Object [] fields, Object rowId, Boolean [] includeProperty, Boolean [] [] includeColumns, tabla Int32, instrucción IDbCommand, sesión ISessionImplementor, índice Int32) s: / NHibernate / NHibernate / src / NHibernate / Persister / Entity / AbstractEntityPersister.cs (2754,0): en NHibernate.Persister.Entity.AbstractEntityPersister.Update (Object id, Object [] fields, Object [] oldFields, Object rowId, Boolean [ ] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) s: / NHibernate / NHibernate / src / NHibernate / Persister / Entity / AbstractEntityPersister.cs (2666,0): en NHibernate.Persister.Entity.AbstractEntityPersister .UpdateOrInsert (Object id, Object [] fields, Object [] oldFields, Object rowId, Boolean [] includeProperty, Int32 j, Object oldVersion, Object obj, SqlCommandInfo sql, ISessionImplementor session) s: / NHibernate / NHibernate / src / NHibernate / Persister / Entity / AbstractEntityPersister.cs (2 940,0): en NHibernate.Persister.Entity.AbstractEntityPersister.Update (Object id, Object [] fields, Int32 [] dirtyFields, Boolean hasDirtyCollection, Object [] oldFields, Object oldVersion, Object obj, Object rowId, ISessionImplementor session) s : / NHibernate / NHibernate / src / NHibernate / Action / EntityUpdateAction.cs (78,0): en NHibernate.Action.EntityUpdateAction.Execute () s: / NHibernate / NHibernate / src / NHibernate / Engine / ActionQueue.cs (130, 0): en NHibernate.Engine.ActionQueue.Execute (ejecutable IExecutable) s: / NHibernate / NHibernate / src / NHibernate / Engine / ActionQueue.cs (113,0): en NHibernate.Engine.ActionQueue.ExecuteActions (lista IList) s : / NHibernate / NHibernate / src / NHibernate / Engine / ActionQueue.cs (147,0): en NHibernate.Engine.ActionQueue.ExecuteActions () s: / NHibernate / NHibernate / src / NHibernate / Event / Default / AbstractFlushingEventListener.cs ( 241,0): en NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions (sesión de IEventSource) s: / NHibernate / NHibernate / src / NHibernate / Event / Default / D efaultFlushEventListener.cs (19,0): en NHibernate.Event.Default.DefaultFlushEventListener.OnFlush (evento FlushEvent) s: / NHibernate / NHibernate / src / NHibernate / Impl / SessionImpl.cs (1478,0): en NHibernate.Impl. SessionImpl.Flush () s: / NHibernate / NHibernate / src / NHibernate / Transaction / AdoTransaction.cs (187,0): en NHibernate.Transaction.AdoTransaction.Commit () en lambda_method (ExecutionScope, ITransaction)

Ahora, lo interesante es que si comento la referencia a Company o PrimaryListing en SecurityMap, no obtengo el error. No parece importar lo que comento. El error solo ocurre cuando tengo ambos.

Cuando la actualización realmente se realiza, NHProf me muestra esta actualización:

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

No estoy seguro de por qué está actualizando CompanyId y EndDate, pero sospecho que está relacionado.

¿Alguien tiene ideas? La solución sería muy apreciada.


Sí, es un problema común, está utilizando la Column "EndDate" dos veces en su definición de mapeo (tanto para la Compañía como para la Lista primaria) y eso no está permitido. Uno de ellos tiene que ir, o tener una columna EndDate adicional (uno para cada asociación)

compruebe esto también nHibernate 2.0 - mapear una relación de identificación compuesta * y * muchos a uno provoca un error de "índice no válido"

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