Hola,

Creo que la sesion que estas creando con el interceptor no la estas usando.
 Cuando haces *sessionContext.Session.SessionFactory.OpenSession(clsInterceptor)
¿*donde estas guardando esta sesion creada?.  Ademas pareciera que ya
existiera otra sesion con la que estas trabajando porque haces
*sessionContext.Session....
* ese *Session* supongo que es una sesion de NHibernate, sin embargo en el
codigo que enviaste no veo donde la estas creando por primera vez porque
alli es donde deberias introducir el interceptor.

El OnLoad se ejecuta cuando se carga una instancia.  El OnSave cuando se
ejecuta por cada instancia que se va a persistir.  Como tu instancia es
nueva me atreveria a decir que solo se ejecutaria el OnSave ah y tambien el
IsTransient.

Otra cuestion que me inquieta es el hecho de que tu debes notificar a
NHibernate unicamente cuando CREAS una entidad nueva o cuando la ELIMINAS
pero las modificaciones son persistidas automaticamente por el mecanismo de
*DirtyChecking *dentro del ambito de la transaccion.  Por tal motivo es
redundante informar a NHibernate cada vez que modificas una entidad que te
has traido de la base de datos debido a que la sesion guarda la referencia a
esta entidad y esta pendiente de todo lo que cambias.  Sin embargo si estas
trabajando de manera diferente, esto es por ejemplo que utilizas una sesion
para traer datos, y luego usas otra sesion para persistir los datos pues
realmente estarias desaprovechando parte del potencial de NHibernate, sin
embargo no digo que este mal, solo que seria interesante conocer cual es tu
estrategia del manejo de la sesion.

Bueno cuentanos como te va,
Nestor Rodriguez

2010/9/24 Google Cris <[email protected]>

> Hola aun sigo en pruebas:
>
> Nelo: Asi lo entendi ahora que hice las pruebas con el SaveOrUpdate,
> he probado para todos lo que mencionaste, claves con secuenciales,
> guid y ahora con composite-id, y si en este composite-id por ahora lo
> trabaje a mano como dices, por eso busco en la base de datos si ya
> existe para actualizarlo y sino lo creo. Pero pense que habria otra
> forma de hacerlo sin tener que estar verificando en la BD si el valor
> existe o no (para los que tiene claves compuestas). Por eso me
> interese en saber como es lo del interceptor con los metodos
> IsTransient() Load() y Save() que menciona Nestor. Y sigo probando
> pero no entiendo mucho esa parte.
>
> Ahora Nestor:
>
> Nestor hice todo lo que me dijiste, implemente en mi clase base
> TipoListadoBase lo siguiente:
>
> using System;
> using System.Collections;
> using System.Collections.Generic;
> using Iesi.Collections;
> using Iesi.Collections.Generic;
> using System.Text;
> using System.Text.RegularExpressions;
>
> namespace PDVSA.Negocio.Entidades.Base
> {
> /// <summary>
> /// Descripcion de la clase TipoListado
> /// </summary>
> public class TipoListadoBase :
>
> PDVSA.Business.Entities.Core.AbstractEntity<PDVSA.Business.Entities.Core.CompositeID>
>        {
>                // Encerrado en #region
>                Fields
>
>                #region IsTransient
>
>                private bool _saved = false;
>
>                public virtual void OnSave()
>                {
>                 _saved = true;
>                }
>
>                public virtual void OnLoad()
>                {
>                        _saved = true;
>                }
>
>                public virtual bool IsSaved
>                {
>                        get { return _saved; }
>                }
>
>                #endregion
>
>                // Encerrado en #region
>                Constructor
>
>                // Encerrado en #region
>                Properties
>
>                // Encerrado en #region
>                Public Methods
>        }
> }
>
> Despues implemente el interceptor con herencia de EmptyInterceptor,
> sobreescribiendo los metodos IsTransient() Load() y Save() asi:
>
> using System;
> using System.Collections.Generic;
> using System.Text;
> using NHibernate;
> using NHibernate.Type;
>
> namespace PDVSA.Negocio.Entidades.Base
> {
>    public class Interceptor : EmptyInterceptor
>    {
>        public override bool? IsTransient(object entity)
>        {
>            if (entity is TipoListado)
>            {
>                return !((TipoListado)entity).IsSaved;
>            }
>            else
>            {
>                return null;
>            }
>        }
>
>        public override bool OnLoad(object entity, object id, object[]
> state, string[] propertyNames, IType[] types)
>        {
>            if (entity is TipoListado) ((TipoListado)entity).OnLoad();
>            return false;
>        }
>
>        public override bool OnSave(object entity, object id, object[]
> state, string[] propertyNames, IType[] types)
>        {
>            if (entity is TipoListado) ((TipoListado)entity).OnSave();
>            return false;
>        }
>    }
> }
>
> Lo instancie y pase como parametro asi en mi clase de pruebas:
>
> //Se reajusta la conexión a la base de datos
>                DemoLogicaNegocioConfiguradorBaseDatos
> demoLogicaNegocioConfiguradorBaseDatos = new
> DemoLogicaNegocioConfiguradorBaseDatos();
>
>
> PersistenceService.Service.Reinitialize(demoLogicaNegocioConfiguradorBaseDatos);
>
>                //Se obtiene una instancia del objeto SessionContext
>                ISessionContext sessionContext =
> PersistenceService.Service.CreateContext();
>
>                // Aqui en interceptor instanciado
>                Interceptor clsInterceptor = new Interceptor();
>
>                // Lo que me dijiste del OpenSession con el
> interceptor
>
> sessionContext.Session.SessionFactory.OpenSession(clsInterceptor);
>
>                Listado clsListado =
> sessionContext.Session.Get<Listado>((long)1);
>
>                TipoListado clsTipoListado = new TipoListado();
>
>                // Valor nuevo o para actualizar
>                 clsTipoListado.PK_CodigoListado = clsListado.ID;
>                 clsTipoListado.PK_CodigoTipoListado = 64;
>                clsTipoListado.DescripcionTipoListado = "nuevo o
> actualizado";
>
>                //aqui comentado
>                //clsTipoListado.OnLoad(sessionContext.Session,
> clsTipoListado.ID);
>                //clsTipoListado.OnSave(sessionContext.Session);
>                //clsTipoListado.OnUpdate(sessionContext.Session);
>                //clsTipoListado.OnLoad();
>                //clsTipoListado.OnSave();
>                //sessionContext.Session.Save(clsTipoListado);
>
>
> sessionContext.SaveOrUpdate<TipoListado>(clsTipoListado);
>
> Probe con todo lo que esta "aqui comentado" y creo que algo no esta
> bien, pues no veo que pase por los metodos sobrecargados, o no se como
> es la cosa al momento de guardar para que entienda que es un valor
> nuevo o un valor a actualizar.
>
> Como funcionarian entonces ese OnLoad y OnSave?
>
> --
> 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