Gracias por compartir este metodo, solucione en unhaddins el mismo problema de merge con las collections de WPF, copiando tu implementación.
El 24 de julio de 2009 08:29, Juan Ernesto Hernández <[email protected]>escribió: > > Hola Fabio > > Encontre el problema, como te decia yo usaba el Merge para atachar un > objeto "Detached" de nuevo a la sesión. > El problema estaba en que yo tenia implementado IUserCollectionType > para mis colecciones y el método ReplaceElements de la siguiente forma > > object IUserCollectionType.ReplaceElements(object original, > object target, ICollectionPersister persister, > object owner, System.Collections.IDictionary copyCache, > ISessionImplementor session) > { > ICollection<T> result = (ICollection<T>)target; > result.Clear(); > foreach (object item in ((System.Collections.IEnumerable) > original)) > { > result.Add((T)item); > } > return result; > } > > como saque de algunos forums: > > El problema esta en que en esa implementación no se tiene en cuenta el > copyCache, cambiando la implementación para > > object IUserCollectionType.ReplaceElements(object original, > object target, ICollectionPersister persister, > object owner, System.Collections.IDictionary copyCache, > ISessionImplementor session) > { > ICollection<T> result = (ICollection<T>)target; > result.Clear(); > foreach (object item in ((System.Collections.IEnumerable) > original)) > { > if (copyCache.Contains(item)) > result.Add((T)copyCache[item]); > else > result.Add((T)item); > } > return result; > } > > ya me funciona, sería bueno que hubiese alguna documentación de como > implementar las interfaces de usuario para no cometer estos errores > que le pueden costar a uno dias para darse cuenta. > > De todas formas gracias por tu ayuda. > Juan Ernesto > > On 22 Jul, 19:43, Fabio Maulo <[email protected]> wrote: > > a ver los mappings y lo que estas haciendo entre el openSession y el > flush > > > > El 22 de julio de 2009 15:36, Juan Ernesto Hernández > > <[email protected]>escribió: > > > > > > > > > > > > > > > > > Disculpa mi ignorancia, pero una cosa, no se supone que el Merge sirva > > > para atachar un objeto previamente cargado en otra sesión de > > > NHibernate. > > > > > A ver si me hago entender, yo no quiero mantener una sesión de > > > NHibernate abierta duarante todo el tiempo que dure la conversación > > > (Tiempo de sesión Http). > > > Quiero crear una sesión al inicio de un request y destruirla al final, > > > y quiero que algunos de los objetos se mantengan guardados (por ej. en > > > la sessión Http o en cualquier otro lugar) > > > para en el proximo request asociarlo a la nueva sesión y trabajar con > > > ellos, por ej. acediendo a colecciones lazy etc. y decidiendo si los > > > cambios son persistidos durante esa sesión o se mantienen pendientes > > > para ser persistidos en otra sesión. Eso es posible?. > > > > > Saludos > > > Juan Ernesto > > > > > On 22 Jul, 18:14, Fabio Maulo <[email protected]> wrote: > > > > El 22 de julio de 2009 13:56, Juan Ernesto Hernández > > > > <[email protected]>escribió: > > > > > > > No se si me explique bien, pero la idea era que la entidad servicio > se > > > > > guarda de un request para otro en el contexto de la sesion Http > > > > > de forma tal que las modificaciones echas, es decir la adición de > un > > > > > departamento a la lista de departamentos se mantiene pendiente > > > > > de aplicar a la BD > > > > > > Eso es justo lo que *no hay* que hacer usando session-per-request. > > > > Como dije ante en session-per-request las instancias de las entidades > > > mueren > > > > al terminar el request (*no pueden quedar alive* en la HttpSession). > > > > > > DeepClone = genera nuevas instanciasShallowClone = copia las > instancias. > > > > > > Igual tu problema no es ni el Clone ni el Merge; tu problema es que > estas > > > > mixando dos patrones session-per-conversation con session-per-request > y > > > eso > > > > no te va a funcionar (seguro no funciona a largo plazo) ni si prendes > una > > > > vela a la virgen de Lujan. > > > > > > Ese mix es explosivo... empezarás a usar Evict, reattach, Flush en el > > > medio > > > > de un request... te lo digo porque es un "deja vú". > > > > Si te parece que hay que insistir podes seguír, pero dormí > preocupado. > > > > > > -- > > > > Fabio Maulo > > > > -- > > Fabio Maulo- Ocultar texto citado - > > > > - Mostrar texto citado - > --~--~---------~--~----~------------~-------~--~----~ > 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 To unsubscribe, reply using "remove me" as the subject.
