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
