Hola Raul,
Hay varias cosas en tu ejemplo que no estan bien, no se si porque lo
copiaste incorrectamente al mail o porque estan definitivamente mal. Te pido
que reescribas tu codigo de esta manera (y que cambies lo que corresponda
siempre y cuando entiendas los motivos). Estos son los puntos que no me
cierran
- No queda claro el scope de la variable _session.
- Estas agregando LA MISMA INSTANCIA de chuild a todos los parents, me
parece que eso no es lo que queres hacer.
- Veo una propiedad Parent en el child que no estas seteando en el codigo
que enviaste.
- Estas haciendo un update con cada parent, esto no seria necesaro, incluso
no es necesario hacer ninguno con la opcion de cascade que tenes.
// Aca achicas mucho mas el scope de session, el metodo
// CreateSession() depende de cómo manejes e sessionFactory
// pero deberia ser una sesion nueva puesto que estas haciendo
// el Dispose al salir del using(), esa sesion no servira para
// nada mas.
using ( ISession s = CreateSession() )
using ( ITransaction tx = s.BeginTransaction() )
{
_parents = s.CreateCriteria(typeof(Parent)).List<Parent>();
foreach(Parent p in _parents) {
p.Children.Clear();
// DIFERENCIA con tu codigo, creo una instancia para cada
parent
// y proponto una alternatia para setear la propiedad patent
en
// child, aunque me gustaria mas asi: p.AddChild( 500 ) y
que el
// parent haga el new Child( this ); y luego setee el Valor.
Child c = new Child( p );
c.Valor = 500;
p.AddChild( c );
// Entiendo que esta linea es prescindible
s.Update(p);
}
tx.Commit();
}
Carlos Peix
-----Mensaje original-----
De: [email protected]
[mailto:[email protected]] En nombre de Raul Lopez
Enviado el: Lunes, 12 de Enero de 2009 08:16 a.m.
Para: [email protected]
Asunto: [NHibernate-Hispano] ayuda con coleccion
Hola, por favor si me pueden dar una mano con esto.
La idea es borrar la coleccion en el child y sustituirla con una nueva pero
hay algo mal y no me doy cuenta.
Lo que esta haciendo es generar un solo registro colgado del ultimo parent.
_parents = _session.CreateCriteria(typeof(Parent)).List<Parent>();
foreach(Parent p in _parents) {
p.Children.Clear();
}
Child c = new Child();
c.Valor = 500;
// agrega un child valor 500 a cada parent
foreach(Parent p in _parents) {
p.AddChild(c);
_session.Update(p);
}
_session.BeginTransaction().Commit();
del mapeo del parent
...
<bag name="Children" inverse="true" cascade="all-delete-orphan">
<key column="parent_id"/>
<one-to-many class="Child"/>
</bag>
...
del mapeo del child
...
<many-to-one name="Parent" column="parent_id" /> ...
Desde ya muchas gracias.
Saludos,
Raul
--~--~---------~--~----~------------~-------~--~----~
Para escribir al Grupo, hágalo a esta dirección:
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano
-~----------~----~----~----~------~----~------~--~---