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

Responder a