exactamente lo que dijo Walter, podrías usar EndMode.End sobre el metodo que
busca los datos. Eso te garantiza que al finalizar dicho metodo se cierra la
sesión.
Al volver a llamar el metodo, otra sesión se vuelve a crear.

saludos,

El 17 de octubre de 2011 22:19, Walter Poch <[email protected]>escribió:

> Hola,
>
> Mirá desconozco bien el manejo de PersistenceConversational como la esta
> haciendo, pero lo que recuerdo es que esto manejaba la Unit Of Work (
> http://martinfowler.com/eaaCatalog/unitOfWork.html) que en NHibernate
> sería la Session.
>
> Lo que te está pasando es porque la Unit Of Work (Session) es la misma con
> la que estás leyendo los datos antes de cambiar el dato en la DB y LUEGO de
> cambiar el dato; para que NHibernate se de cuenta debería ser otra Session.
>
> En algún momento tus métodos deberían terminar la Unit Of Work (al grabar
> una entidad o al cancelar los cambios por ejemplo), deberías ver el ejemplo
> en unhaddins como es su uso. Lamentablemente no puedo ayudarte más ya que no
> lo utilizo.
>
> Saludos,
>
> El 17 de octubre de 2011 17:33, Alexandre 
> <[email protected]>escribió:
>
> Olá Todos!
>>
>> Es una aplicación WPF y estoy siguiendo las ideas de
>> ChinookMediaManager.
>>
>> Tengo un nivel de servicio:
>>
>>   [PersistenceConversational(MethodsIncludeMode =
>> MethodsIncludeMode.Implicit, DefaultEndMode = EndMode.Continue)]
>>    public class FornosConsumoService : IFornosConsumoService
>>    {
>>        private readonly IRepository<RFConsumption>
>> rFConsumptionRepository;
>>
>>        public FornosConsumoService(IRepository<RFConsumption>
>> rFConsumptionRepository)
>>        {
>>            this.rFConsumptionRepository = rFConsumptionRepository;
>>        }
>>
>>        /// <summary>
>>        /// Consulta consumo por hora (período)
>>        /// </summary>
>>        /// <param name="dataHoraInicio"></param>
>>        /// <param name="dataHoraFim"></param>
>>        /// <returns></returns>
>>        public IEnumerable<RFConsumption> ConsultarPorHora(DateTime
>> dataHoraInicio, DateTime dataHoraFim)
>>        {
>>            try
>>             {
>>                var criteria = DetachedCriteria.For<RFConsumption>()
>>                    .Add(Restrictions.Between("CounterDtm",
>> dataHoraInicio, dataHoraFim));
>>
>>                return
>> rFConsumptionRepository.GetListCriteria(criteria,
>> Order.Desc("CounterDtm"));
>>            }
>>             catch (Exception ex)
>>            {
>>                Log.Error(Strings.EventNatureFornosConsumo,
>> Strings.MessageExceptionConsult, ex);
>>                throw;
>>            }
>>        }
>> }
>>
>> Tengo un configurador GuyWire
>>
>>    public class GeneralGuyWire : IGuyWire
>>    {
>>        private readonly IConfigurator[] configurators = new
>> IConfigurator[]
>>                                                             {
>>                                                                 new
>> NHibernateConfigurator(),
>>                                                                 new
>> GUIsConfigurator(),
>>                                                                 new
>> RepositoriesConfigurator(),
>>                                                                 new
>> ServicesConfigurator()
>>                                                             };
>>
>>        private IWindsorContainer container;
>>
>>        public void Wire()
>>        {
>>            try
>>            {
>>                if (container != null)
>>                    Dewire();
>>
>>                container = new WindsorContainer();
>>
>>                container.AddFacility<FactorySupportFacility>();
>>
>>                ServiceLocator.SetLocatorProvider(() => new
>> WindsorServiceLocator(container));
>>
>>
>>
>> container.Register(Component.For<IServiceLocator>().Instance(ServiceLocator.Current));
>>
>>                foreach (IConfigurator configurator in configurators)
>>                    configurator.Configure(container);
>>            }
>>            catch (Exception ex)
>>            {
>>                Log.Error(Strings.EventNatureSystem, "Exceção ao
>> configurar aplicação!", ex);
>>                ShowMessage.Error("Exceção ao configurar aplicação!",
>> ex.Message);
>>                throw;
>>            }
>>        }
>>
>>        public void Dewire()
>>        {
>>            Log.Debug(Strings.EventNatureSystem, "Executando...");
>>
>>            if (container != null)
>>                container.Dispose();
>>        }
>>    }
>>
>>    public class ServicesConfigurator : IConfigurator
>>    {
>>        public void Configure(IWindsorContainer container)
>>        {
>>            try
>>            {
>>                IEnumerable<Type> DomainServicesInterfaces =
>> typeof(IFornosConfiguracaoService).Assembly
>>                    .GetTypes().Where(t => t.IsInterface &&
>> t.Namespace.EndsWith("Service"));
>>
>>                IEnumerable<Type> DomainServices =
>> Assembly.Load("PCT.Service").GetTypes()
>>                    .Where(t => t.GetInterfaces().Any(i =>
>> DomainServicesInterfaces.Contains(i)));
>>
>>                foreach (Type domainServicesInterfaces in
>> DomainServicesInterfaces)
>>                    foreach (Type domainServices in DomainServices)
>>                        if
>> (domainServicesInterfaces.IsAssignableFrom(domainServices))
>>                        {
>>                            Log.Info(Strings.EventNatureSystem,
>> "Registrando " + domainServices.Name + "...");
>>
>>
>> container.Register(Component.For(domainServicesInterfaces).ImplementedBy(domainServices).LifeStyle.Transient);
>>                        }
>>            }
>>            catch (Exception ex)
>>            {
>>                Log.Error(Strings.EventNatureSystem, "Exceção ao
>> registrar serviços!", ex);
>>                throw;
>>            }
>>        }
>>    }
>>
>>    public class RepositoriesConfigurator : IConfigurator
>>    {
>>        public void Configure(IWindsorContainer container)
>>        {
>>            try
>>            {
>>
>>
>> container.Register(Component.For(typeof(IRepository<>)).ImplementedBy(typeof(Repository<>)).LifeStyle.Transient);
>>            }
>>            catch (Exception ex)
>>            {
>>                Log.Error(Strings.EventNatureSystem, "Exceção ao
>> registrar repositórios!", ex);
>>                throw;
>>            }
>>        }
>>    }
>>
>> he implementado mi repositorio basado en el siguiente class (Chinook):
>>
>> namespace ChinookMediaManager.Data.Impl
>> {
>>        public class Dao<T> : IDao<T>
>>        {
>>                protected readonly ISessionFactory Factory;
>>
>>                public Dao(ISessionFactory factory)
>>                {
>>                        Factory = factory;
>>                }
>>
>>                protected ISession CurrentSession
>>                {
>>                        get { return Factory.GetCurrentSession(); }
>>                }
>>
>>                #region IDao<T> Members
>>
>>                public T Get(object id)
>>                {
>>                        return CurrentSession.Get<T>(id);
>>                }
>>
>> ....
>>
>> Estoy confundido acerca de la interacción entre unhAddins e
>> nHibernate. Creo que la configuración de unhAddins es correcta porque
>> se obtienen los datos correctamente en la primera llamada.
>>
>> Después de cambiar el valor de un campo (via Toad - BD Oracle), corro
>> de nuevo el servicio, pero los datos anteriores siguen siendo los
>> mismos en la memoria. Este es el comportamiento de cache de
>> nHibernate?
>>
>> Gracias
>>
>>
>>
>> On 17 oct, 15:42, Walter Poch <[email protected]> wrote:
>> > Y que tipo de aplicación es, y como es el despliegue/arquitectura?
>> >
>> > Si es una app web o los servicios los consumis por WCF/WebServices lo
>> > recomendado es Session Per Request.
>> >
>> > Saludos,
>> >
>> > El 17 de octubre de 2011 13:53, José F. Romaniello
>> > <[email protected]>escribió:
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> > > La sesión de nhibernate es un cache.
>> > > A mi entender, esa implementación del repositorio no debería estar
>> atada a
>> > > un manejo de sesión, es decir que el ciclo de vida es algo que
>> deberías
>> > > manejarse a un nivel mas alto.
>> >
>> > > Como estas manejando el ciclo de vida actualmente? que patrón usas?
>> >
>> > > saludos
>> >
>> > > El 17 de octubre de 2011 12:30, Alexandre <[email protected]
>> >escribió:
>> >
>> > > Hola a todos!
>> >
>> > >> Estoy usando nHibernate + uNhAddins.
>> >
>> > >> Mi repositorio es:
>> >
>> > >>    public class Repository<T> : IRepository<T> where T : IEntity
>> > >>    {
>> > >>        private readonly ISessionFactory factory;
>> >
>> > >>        protected ISession Session
>> > >>        {
>> > >>            get
>> > >>            {
>> > >>                return factory.GetCurrentSession();
>> > >>            }
>> > >>        }
>> >
>> > >>        public Repository(ISessionFactory factory)
>> > >>        {
>> > >>            this.factory = factory;
>> > >>        }
>> >
>> > >>        public IEnumerable<T> GetListCriteria(DetachedCriteria
>> > >> criteria, params Order[] orders)
>> > >>        {
>> > >>            return RepositoryHelper<T>.GetExecutableCriteria(Session,
>> > >> criteria, orders).List<T>();
>> > >>        }
>> >
>> > >>    class RepositoryHelper<T>
>> > >>    {
>> > >>        public static ICriteria GetExecutableCriteria(ISession
>> > >> session, DetachedCriteria criteria, Order[] orders)
>> > >>        {
>> > >>            ICriteria executableCriteria;
>> >
>> > >>            if (criteria != null)
>> > >>                executableCriteria =
>> > >> criteria.GetExecutableCriteria(session);
>> > >>            else
>> > >>                executableCriteria =
>> > >> session.CreateCriteria(typeof(T));
>> >
>> > >>            if (orders != null)
>> > >>            {
>> > >>                foreach (Order order in orders)
>> > >>                    executableCriteria.AddOrder(order);
>> > >>            }
>> >
>> > >>            return executableCriteria;
>> > >>        }
>> > >>    }
>> > >> }
>> >
>> > >> Mi servicio es:
>> >
>> > >>                var criteria = DetachedCriteria.For<RFConsumption>()
>> > >>                    .Add(Restrictions.Between("CounterDtm",
>> > >> dataHoraInicio, dataHoraFim));
>> >
>> > >>                return
>> > >> rFConsumptionRepository.GetListCriteria(criteria,
>> > >> Order.Desc("CounterDtm"));
>> >
>> > >> Cuando se ejecuta el servicio por primera vez, los datos se devuelven
>> > >> correctamente, pero si modifico el valor de un campo directamente en
>> > >> la base de datos con otra aplicación, el nuevo valor no se devuelve
>> > >> por NHibernate.
>> >
>> > >> Si cambio el depósito:
>> >
>> > >>        protected ISession Session
>> > >>        {
>> > >>            get
>> > >>            {
>> > >>                factory.GetCurrentSession().Clear();
>> > >>                return factory.GetCurrentSession();
>> > >>            }
>> > >>        }
>> >
>> > >> valor modificado por otra aplicación siempre se devuelve.
>> >
>> > >> ¿cuál es la mejor manera de implementar el repositorio?
>> >
>> > >> Creo que Session.Clear no es la mejor manera de resolver esta
>> > >> cuestión, ya que estoy usando uNhAddins en mi capa de servicio.
>> >
>> > >> Gracias
>> >
>> > >> --
>> > >> 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
>> >
>> > --
>> > Saludos,
>> >
>> > Walter G. Poch
>> > Sr. .Net Developer
>> > --------------------------------------------
>> > Cell: +54 (9 341) 3353273
>> > [email protected]
>>
>> --
>> Para escribir al Grupo, hágalo a esta dirección:
>> [email protected]
>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>
>
>
>
> --
> Saludos,
>
> Walter G. Poch
> Sr. .Net Developer
> --------------------------------------------
> Cell: +54 (9 341) 3353273
> [email protected]
>
> --
> 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