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