c# nhibernate cascade

c# - Guía de aplicación de NHibernate Definitive Cascade



(3)

Este podría ser un consejo obvio, pero sugeriría que busques una publicación anterior hecha por Ayende . Una búsqueda rápida de NHibernate y cascada en su sitio reveló algunas publicaciones interesantes. Sin embargo, podrían ser demasiado escasos para sus necesidades.

Aunque no es un recurso de Internet per se, también recomendaría NHibernate en acción . Aborda las cascadas con cierta profundidad en los capítulos 3, 4 y 6. El libro está dirigido a NHibernate 1.2. Creo, sin embargo, que habrá una nueva edición del libro que apunta al lanzamiento 3.0 de NHibernate; podría valer la pena vigilarlo.

Por mucho que me hubiera gustado ver una guía definitiva de cascadas, no he visto ninguna. Tal vez puedas resumir algunas de las publicaciones de blog que están discutiendo cascadas con tu propia publicación en tu propio blog.

¿Hay algún recurso de Internet que tenga una guía definitiva para todas las configuraciones de cascada de NHibernate que incluirá ejemplos de la estructura de clases, HBM y las implicaciones de las acciones con cada una de las configuraciones de cascada para todas las relaciones con NH?

También sería útil que hubiera ejemplos de asociaciones comunes que se hicieran de la manera más correcta, como configurar una tabla de estados donde nunca se terminará la cascada eliminando un estado, o que eliminar un objeto que tiene una propiedad de Usuario CreatedBy nunca termine borrando al usuario en una cascada, etc.


No conozco ninguna guía "definitiva", pero el mejor recurso que conozco es una publicación de blog de Ayende, que es uno de los gurús definitivos en NHibernate:

Cascadas de NHibernate: la diferencia entre todos, todos-eliminar-huérfanos y guardar-actualizar

Para mí, en realidad solo uso cascade="none" y cascade="all" . all-delete-orphan veces es una opción. Todo lo demás es sospechoso Por ejemplo, ¿por qué debería crear implícitamente una instancia porque se hace referencia a ella, cuando vive más tiempo que el objeto que la contiene? Para mí, solo hay dos situaciones: o el objeto es dependiente o independiente.


A continuación se muestra una adaptación de la referencia de Java Hibernate http://docs.jboss.org/hibernate/stable/core/manual/en-US/html/objectstate.html#objectstate-transitive para NHiberate 3.0 (es decir, el tronco svn actual) .

Para cada operación básica de la sesión de NHibernate, incluidas Persist (), Merge (), SaveOrUpdate (), Delete (), Lock (), Refresh (), Evict (), Replicate () - existe un estilo de cascada correspondiente. Respectivamente, los estilos de cascada se denominan persistir, fusionar, guardar-actualizar, eliminar, bloquear, actualizar, desalojar, replicar. El estilo de cascada para Save () y Update () es save-update; para SaveAndUpdateCopy () es fusión; y para PersistOnFlush () persiste. Y eliminar es un alias para eliminar.

Si desea que una operación se organice en cascada a lo largo de una asociación, debe indicarlo en el documento de mapeo. Por ejemplo:

<one-to-one name="person" cascade="persist"/>

Los estilos de Cascade se pueden combinar:

<one-to-one name="person" cascade="persist,delete,lock"/>

Puede usar cascade = "all" para especificar que todas las operaciones se deben realizar en cascada a lo largo de la asociación. La cascada predeterminada = "ninguno" especifica que ninguna operación se va a conectar en cascada.

Un estilo de cascada especial, eliminar-huérfano, se aplica solo a las asociaciones de uno a muchos, e indica que la operación Eliminar () se debe aplicar a cualquier objeto secundario que se elimine de la asociación. Y all-delete-huérfano es lo mismo que all, delete-huérfano.

Recomendaciones:

  • Normalmente no tiene sentido habilitar la cascada en una asociación <muchos-a-uno> o <muchos-a-muchos>. Cascade suele ser útil para asociaciones <uno-a-uno> y <uno-a-muchos>.
  • Si la vida útil del objeto secundario está limitada por la vida útil del objeto principal, conviértalo en un objeto del ciclo de vida especificando cascade = "all-delete-huérfano".
  • De lo contrario, es posible que no necesite cascada en absoluto. Pero si crees que a menudo trabajarás con tus padres e hijos juntos en la misma transacción, y quieres ahorrarte algo de tipeo, considera usar cascade = "persist, merge, save-update".

El mapeo de una asociación (ya sea una asociación de un solo valor o una colección) con cascade = "all" marca la asociación como una relación de estilo padre / hijo donde save / update / delete de parent resulta en save / update / delete del child o niños. Un hijo que no se refiere a su padre no se elimina automáticamente, excepto en el caso de una asociación <uno a muchos> mapeada con cascada = "eliminar-huérfano". La semántica precisa de las operaciones en cascada para una relación padre / hijo es la siguiente:

  • Si un padre se pasa a Persistir (), todos los hijos pasan a Persistir ()
  • Si un padre pasa a Merge (), todos los hijos pasan a Merge ()
  • Si un padre se pasa a Save (), Update () o SaveOrUpdate (), todos los elementos secundarios se pasan a SaveOrUpdate ()
  • Si un elemento secundario permanente o separado es referenciado por un elemento primario persistente, se pasa a SaveOrUpdate ()
  • Si se elimina un padre, todos los hijos pasan a Eliminar ()
  • Si un padre persistente desreferencia a un niño, no ocurre nada especial: la aplicación debe eliminar explícitamente al niño si es necesario, a menos que cascade = "delete-huérfano", en cuyo caso el niño "huérfano" se elimine.