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
