Je, Carlos me ganaste de mano. Raul el patron de session que usas, espero
que solo sea para un test en una aplicacion production te va a complicar la
vida. Si queres fiajte los ejemplos de session management en uNHAddins ya
son bastante mas acercados a lo que se tiene que usar en produccion.
Cambie el codigo que recibi de Raul a esto y funciona bien:
using (ITransaction tx = _session.BeginTransaction())
{
// obtiene todo
_parents =
_session.CreateCriteria(typeof(Parent)).List<Parent>();
// borra coleccion
foreach (Parent p in _parents)
{
p.Children.Clear();
}
// agrega un child valor 500 a cada parent
foreach (Parent p in _parents)
{
Child c = new Child();
c.Valor = 500;
p.AddChild(c);
}
// esto me genera un solo child colgado del ultimo parent
tx.Commit();
}
On Mon, Jan 12, 2009 at 2:39 PM, Carlos Peix <[email protected]> wrote:
>
> 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
-~----------~----~----~----~------~----~------~--~---