Gracias Juan Habia llevado el codigo que tenia antes hacia un ActionFilter, y el resultado fue el mismo, claro no habia implementado nada de lo que tu me indicas para los errores, estoy verificando OnResultExecuted el parametro filterContext, y me parece que este tambien podria utilizarlo para verificar alguna exception, y con esto hacer commit o rollback
Creo que con esto y otros argumentos que se han planteado en hilos pasados, volcare todo mi codigo a ActionFilter Gracias a todos nuevamente, solo me queda la incertidumbre de saber si he implementado bien session per request y si este es su comportamiento normal (como lo menciono en el correo anterior) Saludos Edgar El día 20 de julio de 2010 03:57, Juan Cuello <[email protected]> escribió: > Y en lugar de usar session-per-request, estando con MVC, por qué no > pruebas con ActionFilters? > > Creo que se tiene más control de la transacción. A veces, puede que > hagas un SaveOrUpdate y no de error, pero al hacer el commit te puede > fallar. > > Si utilizas Session-per-request tienes poco control de lo que puedes > hacer el finalizar el request. En cambio, si usas actionfilters de > MVC, especificas en el controller el atributo [HandleError] y podrías > hacer lo que quisieras sobreescribiendo el método del controlador > llamado OnException. Ahí podrías devolver al navegador errores en > JSON, mostrar una vista que dé un error, especificar el error en la > vista actual, etc. > > El ActionFilter es un atributo que sería algo así: > > [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] > public class DataSessionCallAttribute : ActionFilterAttribute > { > public override void OnActionExecuting(ActionExecutingContext > filterContext) > { > Inicia_Session_Transaccion(); > } > > public override void OnResultExecuted(ResultExecutedContext > filterContext) > { > Fin_Session_Transaccion(); > } > } > > Y tendrías la vida de la sesión durante la ejecución de un método del > Controlador. > > Yo utilizo esta técnica y también con interceptors. > > > On 19 jul, 23:14, Edgar Ramos <[email protected]> wrote: >> Gracias nuevamente a todos >> >> Puse en practica algo similar a lo que me comentas José, y >> efectivamente como resultado final, en el orden siguiente >> 1.- retorno a la vista el objeto con los mensajes de error >> 2.- se ejecuta Application_EndRequest, y con ello se ejecuta la linea >> del Commit(); >> 3.- Mi objeto que en primera instancia no paso la validacion, tampoco >> fue cambiado en la base de datos, con datos no validos >> >> Pregunta: que hizo el Commit() ?, volvio a persistir mi objeto valido >> ?, aparentemente hizo commint, pero como no habia nada que permanezca >> en save de la session, pues finalmente no hizo nada ?, o >> difinitivamente no tengo que preocuparme porque este es el proceso >> normal ? >> >> Edgar >> >> El día 19 de julio de 2010 13:24, José F. Romaniello >> <[email protected]> escribió: >> >> >> >> > Ahora estamos hablando de otra cosa: >> > suponiendo que vos tenes un action como Save >> > public void Save(ViewModel viewModel) >> > { >> > if(ModelState.IsValid) >> > { >> > hacer algo para continuar guardando. viewModel >> > return View....Siguient. >> > } >> > return View(viewModel); >> > } >> > Lo único que tienes que hacer es implementar IDataErrorInfo en el >> > viewmodel, >> > y creo que en la versión 2.0 si usas DataAnnotations no hace falta nada >> > más. >> > Conclusión final, controller, Asp.Net MVC, ViewModel, etc.... control de >> > excepciones... donde juega NHibernate en la pregunta? >> >> > El 19 de julio de 2010 15:16, Edgar Ramos <[email protected]> escribió: >> >> >> Gracias Gustavo >> >> >> Pecando nuevamente de novato, como logro por un lado regresar a la >> >> vista mi objeto invalido (para que pueda ser visualizado con sus >> >> errores) >> >> y como logro que este objeto ivalido no sea persistido. >> >> >> A lo mejor estan sencillo y yo lo complico demasiado >> >> >> Saludos >> >> >> Edgar >> >> >> El día 19 de julio de 2010 12:58, Gustavo Ringel >> >> <[email protected]> escribió: >> >> > Edgar, si haces return adentro del catch, absorbiste el throw o sea que >> >> > en >> >> > tu vida vas a llegar a la excepcion de tu session manager, a menos que >> >> > "tengas suerte" y return View(objeto) de una excepcion :). >> >> > Gustavo. >> >> >> > 2010/7/19 Edgar Ramos <[email protected]> >> >> >> >> En mi pequeño ejemplo de una aplicacion asp net mvc + nh 2.1, he >> >> >> implementado IHttpModule, pero tengo una duda, >> >> >> en mi controller tengo lo siguiente >> >> >> >> try { >> >> >> //codigo que puede lanzar una exception >> >> >> } >> >> >> catch (Exception) { >> >> >> return View(objeto); >> >> >> } >> >> >> >> si por cualquier motivo entra al catch , el codigo abajo descrito >> >> >> Application_EndRequest(), es suficiente para que haga un Rollback() ?, >> >> >> este >> >> >> sería automatico ?, o tengo que implementar algo adicional ? >> >> >> >> Por un lado el patron me dice por cada request una session, noto que >> >> >> en mi ejemplo eso lo esta haciendo, pero por otro lado la parte ACID, >> >> >> con el unit of work , no me esta funcionando, o la verdad ya estoy >> >> >> confundido, si tengo que leer en español o en ingles, cualquier link, >> >> >> pdf, lo que sea me es bienvenido >> >> >> >> private void Application_EndRequest(object sender, EventArgs e) { >> >> >> >> ISession session = CurrentSessionContext.Unbind( >> >> >> ServiceLocator.Current.GetInstance<ISessionFactory>()); >> >> >> >> try { >> >> >> >> if (session.Transaction.IsActive) { >> >> >> session.Transaction.Commit(); >> >> >> } >> >> >> >> } >> >> >> catch (Exception) { >> >> >> if (session.Transaction.IsActive) { >> >> >> session.Transaction.Rollback(); >> >> >> } >> >> >> >> throw; >> >> >> >> } >> >> >> finally { >> >> >> session.Close(); >> >> >> } >> >> >> } >> >> >> >> Saludos >> >> >> >> Edgar >> >> >> >> PD: Me sugirieron hacer unos test, pero recien estoy entrando a ese >> >> >> mundo, >> >> >> >> -- >> >> >> 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 >> >> >> -- >> >> 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 > > -- > 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
