Saludos tropa:
Ya resolvi el problema, el mismo consistia en que en el flujo que les
comentaba se creaban varios instancia de la persona con el mismo Id de
la pesona que yo dseaba eliminar, pero de esas instancias solo una
estaba referenciada por la sesion de NHibernate, y lo que ocurria es
que cuando mandaba a eliminar la persona la instancia por la que
mandaba a eliminar no era la que estaba referenciada por dicha sesion
y por ello el mensaje de error que dio pie a este debate. La solucion
para ello es guardar en una variable la persona que tiene referenciada
la sesion cuyo ip es el de la persona que deseo eliminar: abajo pongo
el codigo

Persona p = MainClass.m_session.Get<Persona>(pcl_per.PerIdPer);

ya de esta forma no importa cuantas instancias con el mismo ip se
puedan haber creado, ya yo tengo la persona que fue referenciada por
nhibernate y entonces es esta la que mando a eliminar

MainClass.m_session.Delete(p);

muchas gracias a todos.

El 17/11/11, Carlos Peix <[email protected]> escribió:
> Hola Dennis,
>
> Algunas observaciones:
>
>    - No enviaste la clase Persona
>    - Tenes el setter publico en los Ids, asumo que tambien en la clase
>    Persona. Esto es una mala practica puesto que el Id debiera manejarlo
>    NHibernate y deberias asegurarte de que no se modifica accidentalmente.
> Mas
>    sobre esto al final.
>    - En la clase OtroNombre y la clase Perdir tiene una implementacion
>    incorrecta de Equals y GetHashCode. La implementacion de estos dos
> metodos
>    debe ser uniforme.
>
> Arriesgando un diagnostico y viendo la implementacion de la propiedades Id,
> sospecho que inadvertidamente estas copiando el Id entre los dos objetos.
> Revisa eso, idealmente, haciendo private el setter de todos los Ids
>
> ----------------------------------
> Carlos Peix
>
> 2011/11/17 Dennis Alba <[email protected]>
>
>> saludos no he mandado las clases porque realmente mapeo con Fluent y
>> se que este foro es mas bien de NHibernate puro y el problema que
>> surge es de sesion, de todas formas aqui les envio las clases.
>>    public partial class Dactilar
>>    {
>>        public virtual long IdDactilar { get; set; }
>>        public virtual long VersionImpresion { get; set; }
>>        public virtual string TipoImpresion { get; set; }
>>        public virtual Persona aPersona { get; set; }
>>    }
>>
>>    public partial class Foto
>>    {
>>        public virtual long IdFoto { get; set; }
>>        public virtual byte[] ImagenRostro { get; set; }
>>        public virtual Persona IdPersona { get; set; }
>>    }
>>
>>    public partial class LugarNacDef
>>    {
>>        public virtual long IdPersona { get; set; }
>>        public virtual Persona RPersona { get; set; }
>>        public virtual string LugarNac { get; set; }
>>        public virtual string FechaNac { get; set; }
>>
>>    }
>>
>>    public partial class OtroNombre
>>    {
>>        public virtual Persona Per_Id_Per { get; set; }
>>        public virtual Persona Per_Id_Otr { get; set; }
>>        public virtual DateTime? FechIdentPer { get; set; }
>>        public virtual string SimilitudPer { get; set; }
>>
>>        public override int GetHashCode()
>>        {
>>            return Per_Id_Per.GetHashCode() + Per_Id_Otr.GetHashCode();
>>        }
>>
>>        public override bool Equals(object obj)
>>        {
>>            return base.Equals(obj);
>>        }
>>    }
>>
>>    public partial class Perdir
>>    {
>>        public virtual Tramite solicitud { get; set; }
>>        public virtual Persona persona { get; set; }
>>        public virtual DateTime? Fech_Reg_Direc { get; set; }
>>
>>        public override bool Equals(object obj)
>>        {
>>            return base.Equals(obj);
>>        }
>>
>>        public override int GetHashCode()
>>        {
>>            return solicitud.GetHashCode() + persona.GetHashCode();
>>        }
>>    }
>>
>>    public partial class Tramite
>>    {
>>        public virtual long IdSol { get; set; }
>>        public virtual Persona PerSol { get; set; }
>>        public virtual string EstSolDc { get; set; }
>>        public virtual long IdFoto { get; set; }
>>        public virtual long SolConsul { get; set; }
>>    }
>>
>> he visto en algunos lugares que dicen que eso se debe a que creo en la
>> sesion de hibernate otro objeto con el mismo id igual al objeto que
>> deseo eliminar, pero no se  quizas con estas clases publicadas me
>> puedan dar otra opinion o quizas la misma
>>
>> El 17/11/11, Carlos Peix <[email protected]> escribió:
>> > Hola Denis,
>> >
>> > No veo que hayas enviado clases al principio este threado. Podrias por
>> > favor enviar el codigo de la clase, al menos la implementacion de la
>> > propiedad Id y del Equals y GetHashCode (estos ultimos en caso de que
>> > los
>> > hayas sobreescrito)
>> >
>> > Gracias
>> >
>> > ----------------------------------
>> > Carlos Peix
>> >
>> > 2011/11/17 Banzai <[email protected]>
>> >
>> >> Disculpen que no haya respondido antes, pero no estaba viniendo a la
>> >> oficina,
>> >> mira el problema es el siguiente: Remontense a las clases que puse al
>> >> principio
>> >> La situacion problemica es que yo puedo llegar a tener dos personas
>> >> insertadas en el sistema p1 y p2, y en un momento determinado me
>> >> percato que los dos son la misma persona, entonces deseo pasar todas
>> >> las solicitudes,direcciones, fotos, lugar de nacimiento que eran de la
>> >> p1 a la p2. para ello hago el siguiente algoritmo
>> >>
>> >> en OtroNombre  hay dos objetos persona (p1cuyo id es 49 y p2 cuyo id
>> >> es 65) mas un campo que explica porque estaban como si fueran
>> >> diferentes
>> >>
>> >> ITransaction transaction = MainClass.m_session.BeginTransaction();
>> >>
>> >> - metodo que reasigna la foto de p1 a p2
>> >>
>> >> - metodo que reasigna direccion de p1 a p2
>> >>
>> >> - metodo que reasigna solicitud de p1 a p2
>> >>
>> >> - metodo que elimina LugarNac de p1
>> >>
>> >> - metodo que elimina OtroNomb donde esta p1 y p2
>> >>
>> >> - metodo que elimina Persona p1
>> >>
>> >> transaction.Commit();
>> >>
>> >> ninguno de estos metodos hace commit adentro solo salvan en la sesion
>> >> de NHibernate, estos son los ejemplos:
>> >> reasignar : MainClass.m_session.Merge(direccion);
>> >> eliminar: MainClass.m_session.Delete(lugarnac);
>> >>
>> >> todos los metodos funcionan menos el ultimo que elimina la persona el
>> >> cual me da el siguiente error:
>> >> a different object with the same identifier value was already
>> >> associated with the session: 49, of entity: Proyecto.Persona
>> >>
>> >> Alguien sabe que significa este mensaje????
>> >>
>> >> --
>> >> Para escribir al Grupo, hágalo a esta dirección:
>> >> [email protected]
>> >> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>> >>
>> >
>> > --
>> > Para escribir al Grupo, hágalo a esta dirección:
>> > [email protected]
>> > Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>
>> --
>> Para escribir al Grupo, hágalo a esta dirección:
>> [email protected]
>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>
>
> --
> Para escribir al Grupo, hágalo a esta dirección:
> [email protected]
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano

-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a