Pregunta

Estamos utilizando el patrón DTO para ordenar nuestros objetos de dominio de la capa de servicio en nuestro repositorio, y luego hacia abajo a la base de datos a través de NHibernate.

Me he encontrado con un problema por el que me tire de un DTO fuera del repositorio (por ejemplo CustomerDTO) y luego convertirlo en el objeto de dominio (Cliente) en mi capa de servicio. entonces trato y guardar un nuevo objeto de nuevo (por ejemplo SalesOrder) que contiene el mismo objeto de cliente. Esto se a su vez convierte a un SalesOrderDTO (y CustomerDTO) para empujar en el repositorio.

NHibernate no le gusta esto- se queja de que el CustomerDTO es un registro duplicado. Estoy suponiendo que esto se debe a que sacó la primera CustomerDTO en la misma sesión y debido a que el regreso se ha convertido de ida y vuelta no puede reconocer esto como el mismo objeto.

¿Estoy atrapado aquí o hay una forma de evitar esto?

Gracias

James

¿Fue útil?

Solución

Puede volver a colocar un objeto a una sesión de NHibernate mediante el uso de bloqueo -. Por ejemplo

_session.Lock(myDetachedObject, NHibernate.LockMode.None);

que puede o no puede ayudar dependiendo exactamente lo que está sucediendo aquí. En una nota lateral, utilizando DTO con NHibernate no es la práctica más común, el hecho de que NHibernate (en su mayoría) es compatible con la ignorancia de persistencia significa que normalmente DTO no se utilizan tan ampliamente como con algunos otros marcos ORM.

Otros consejos

Es realmente acerca de cómo funciona la sesión de NHibernate. Así que si dentro de una sesión tirar de una instancia de su CustomerDTO y luego después de un tiempo que debe recibir el mismo CustomerDTO (digamos por clave primaria) - en realidad se obtendrá referencia al mismo objeto, como lo hizo en su primera recuperación

Así que lo que hace es que o bien combinar los objetos llamando Session.merge o pregunte a su sesión para el objeto llamando session.Get (primaryKey) hacer sus actualizaciones y al ras de la sesión.

Sin embargo, como sugerido por Steve - esto no suele ser lo que haces - que realmente desea conseguir su objeto de dominio desde el almacén de datos y el uso de las OTD (si neede) para transferir los datos a la interfaz de usuario, servicio web que sea ...

Como otros han señalado, es igual a la ejecución y GetHashCode es un paso en la dirección correcta. También busque información sobre el apoyo de NHibernate para el "unir" O / M idioma.

También tiene la opción nosetter.camelcase a su disposición: http://davybrion.com/blog/2009/03/entities-required-properties-and-properties-that-shouldnt-be-modified/

Por otra parte, me gustaría animarle a no ser disuadidos por la falta de información que hay en línea. Esto no quiere decir que estás loco, o hacer las cosas mal. Sólo significa que está trabajando en un caso extremo. Por desgracia, los mayores consumidores de bibliotecas como NHibernate son más bien pequeñas de la casa y / o aplicaciones web, donde existe la libertad de inclinarse toda su persistencia necesita contra una base de datos única. En realidad, hay muchas excepciones a esta regla.

Por ejemplo, actualmente estoy trabajando en una aplicación de escritorio comercial donde uno de mis objetos de dominio tiene sus datos se reparten por un base de datos y archivos de imagen de SQL CE en el disco. Desafortunadamente NHibernate sólo me puede ayudar con la persistencia SQL CE. Me veo obligado a utilizar una especie de "Mapeo doble" (ver "Los patrones de la Martin Fowler Arquitectura de la aplicación ") empresa mapa mi modelo de dominio a través de una capa de repositorio que sabe qué datos va a NHibernate y lo que en el disco.

Sucede. Es una necesidad real. A veces, una aparente falta de una herramienta indica que está teniendo un mal enfoque. Pero a veces la verdad es que sólo son verdaderamente en un caso extremo, y la necesidad de construir algunos de estos patrones por sí mismo para lograr que se haga.

  

Estoy asumiendo que esto se debe a que   sacó el primero en CustomerDTO   la misma sesión y debido a que la   regresar ha sido convertida de nuevo y   establece que no puede reconocer esto como el   mismo objeto.

Tiene usted razón. Hibernate no puede. Considerar la implementación de los iguales y hashCode para solucionar este problema. Creo que una re-enganche sólo puede funcionar si no se ha cargado el objeto dentro de esta sesión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top