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

Responder a