2010-03-10 12 views
6

que estoy tratando de asignar una relación padre-hijo entre un objeto persona y un objeto Organización en FluentNHibernate utilizando referencias en el archivo de mapeo:Mapeo FluentNhibernate Uso de referencias Índice fuera de límites al añadir nuevos objetos

Referencias (x => x.Organización);

La relación es un objeto Persona que contiene una columna OrganizationId que corresponde a un registro en la tabla Organización con el OrganizationId correspondiente. Los registros de personas diferentes pueden pertenecer a la misma organización.

Cuando recupero un objeto Person, funciona correctamente. Person.Organization está lleno. Puedo guardar un objeto Persona y funciona correctamente. Sin embargo, cuando intento agregar un nuevo objeto Persona, obtengo una excepción Índice fuera de rango de NHibernate. La excepción ocurre cuando se llama a session.SaveOrUpdate (persona). He intentado cambiar la asignación a:

Referencias (x => x.Organization) .Cascade.None()

teniendo el mismo error. No puedo entender qué está causando la excepción. La excepción completa es la siguiente:

System.IndexOutOfRangeException: Índice 22 no válido para este SqlParameterCollection con Count = 22. 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) en NHibernate.Type.NullableType.NullSafeSet (IDbCommand cmd, valor del objeto, índice Int32) en NHibernate.Type.ManyToOneType.NullSafeSet (IDbCommand st, valor del objeto, índice Int32, Boolean [] settable, ISessionImplementor session) 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) en NHibernate.Persister. Entity.AbstractEntityPersister.GeneratedIdentifierBin der.BindValues ​​(IDbCommand ps) en NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert (SqlCommandInfo insertSQL, ISessionImplementor sesión, carpeta de IBinder) en NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] fields, Boolean [] notNull, sql SqlCommandInfo, Object obj, sesión ISessionImplementor) en NHibernate.Persister.Entity.AbstractEntityPersister.Insert (Object [] campos, Object obj, sesión ISessionImplementor) en NHibernate.Action.EntityIdentityInsertAction.Execute() en NHibernate.Engine.ActionQueue .Execute (ejecutable de IExecutable) en NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate (entidad de objeto, clave EntityKey, persistencia de IEntityPersister, boolean useIdentityColumn, Object anything, fuente de IEventSource, boolean requiresImmediateIdAccess) en NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId (entidad Object, String entityName, objeto nada, fuente IEventSource, Boolean requiresImmediateIdAccess) en NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId (evento SaveOrUpdateEvent) en NHibernate.Event.Default. DefaultSaveOrUpdateEventListener.EntityIsTransient (evento SaveOrUpdateEvent) en NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate (evento SaveOrUpdateEvent) en NHibernate.Impl.SessionImpl.FireSaveOrUpdate (evento SaveOrUpdateEvent) en NHibernate.Impl.SessionImpl.SaveOrUpdate (Object obj)

+0

No puedo entender qué está causando la excepción porque no ha publicado el código que causa la excepción. (entidad/clases de mapeo) – Paco

+0

Acabo de agregar algo de texto a la pregunta. Se produce al llamar a session.SaveOrUpdate (persona) cuando el objeto persona es una persona nueva que no existe en la base de datos. – Jeff

+0

¿Se ha insertado la organización principal anteriormente? – mxmissile

Respuesta

7

En primer lugar, se produce la excepción porque mapea la misma col umn dos veces en su clase y eso no está permitido. comprobar esto IndexOutOfRangeException Deep in the bowels of NHibernate

En segundo lugar (y de acuerdo con su último comentario) que tiene un organizationid y una propiedad Organización en la clase de persona es una especie de ir contra la corriente. No lo necesitas. Puede acceder a ella a través de per1.Organization.Id

Si ya tiene una organización en su base de datos (dice Id = 5) y asigna la clase Organización para la clase de persona que utiliza la clave externa organizationid, a continuación, cuando el código

Organization theOrganizationWithId5 = nhSession.Get<Organization>(5); 
per1.Organization = theOrganizationWithId5; 
nhSession.Save(per1); 

NHibernate simplemente establecerá el valor 5 en la columna OrganizationId en su tabla Person. No estarás ocupando la Organización.

Cuestiones relacionadas