Pregunta

¿Hay recursos de Internet que tienen una guía definitiva a todas las configuraciones en cascada para NHibernate que incluirán ejemplos de la estructura de clases, HBM y las implicaciones de las acciones con cada uno de los parámetros en cascada para todas las relaciones con NH.

También sería útil si había ejemplos de asociaciones comunes que hay que hacer de la manera más correcta como la creación de una tabla de estados que nunca va a terminar en cascada al eliminar un estado, o que al eliminar un objeto que tiene una CreatedBy propiedad de usuario nunca se va a terminar de eliminar el usuario en una cascada, etc.

¿Fue útil?

Solución

La siguiente es una adaptación de la referencia 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 - incluyendo Persistir (), Merge (), saveOrUpdate (), Eliminar (), bloqueo (), Refresh (), Expulsar (), Replicar () - no es una cascada que corresponde estilo. Respectivamente, los estilos en cascada se nombran persisten, fusionar, save-actualizar, eliminar, bloquear, refresco, desalojar, replicar. El estilo en cascada para Save () y Update () es salvar a la actualización; para SaveAndUpdateCopy () es de combinación; y para PersistOnFlush () es persistir. Y quitar es un alias de eliminación.

Si desea una operación para conectar en cascada a lo largo de una asociación, hay que indicar que en el documento de mapeo. Por ejemplo:

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

Mi estilos en cascada pueden combinar:

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

Puede utilizar cascada = "all" para especificar que todas las operaciones deben ser conectados en cascada a lo largo de la asociación. La cascada default = "ninguno" especifica que no hay operaciones se pueden conectar en cascada a.

Un estilo especial cascada, borrar-huérfano, sólo se aplica a las asociaciones de uno a muchos, e indica que la operación de eliminación () debe ser aplicada a cualquier objeto secundario que se retira de la asociación. Y todo-delete-orphan es lo mismo que todos, delete-orphan.

Recomendaciones:

  • Por lo general no tiene sentido para permitir la cascada en una asociación o . Cascade es a menudo útil para y asociaciones.
  • Si la vida útil del objeto secundario está limitada por el tiempo de vida del objeto padre, lo convierten en un objeto de ciclo de vida especificando en cascada = "all-delete-orphan".
  • De lo contrario, puede que no necesite cascada en absoluto. Pero si usted piensa que a menudo va a trabajar con los padres y niños juntos en la misma transacción, y desea ahorrar un poco de mecanografía, considerar el uso de cascada = "persistir, combinar, guardar-actualización".

Registro de una asociación (ya sea una sola asociación valioso, o una colección) con cascada = "all" marca la asociación como una relación estilo padre / hijo, donde guardar / actualizar / eliminar de los resultados de los padres en Guardar / actualizar / borrar de el niño o los niños. Un niño que se convierte en no referenciados por su padre no se elimina automáticamente, excepto en el caso de una asociación mapeado con cascada = "delete-orphan". La semántica precisa de las operaciones en cascada para una relación padre / hijo son las siguientes:

  • Si un padre se pasa a persistir (), se pasan todos los niños para que persistan ()
  • Si un padre se pasa a Merge (), se pasan todos los niños a Merge ()
  • Si un padre se pasa a Save (), Update () o saveOrUpdate (), todos los niños se pasan a saveOrUpdate ()
  • Si un niño transitoria o separada queda referenciado por un padre persistente, se pasa a saveOrUpdate ()
  • Si se elimina uno de los padres, se pasan todos los niños a Eliminar ()
  • Si un niño se eliminan las referencias por un padre persistente, no sucede nada especial - la aplicación debe eliminar explícitamente el niño si es necesario - a no ser que en cascada = "delete-orphan", en cuyo caso se elimina el niño "huérfanos".

Otros consejos

Esto podría ser un consejo obvio, pero yo sugeriría navegar antiguo puesto hecha por Ayende . Una rápida Búsqueda para NHibernate y en cascada en su sitio revelaron algunos puestos interesantes. Puede ser que, sin embargo, ser un poco demasiado escaso para sus necesidades.

A pesar de que no es un recurso de Internet per se, También recomendaría NHibernate en Acción . Se ocupa de las cascadas con cierta profundidad en el capítulo 3, 4 y 6. Los objetivos de libros NHibernate 1.2. Creo, sin embargo, que habrá una nueva edición del libro dirigido la versión 3.0 de NHibernate; podría valer la pena mantener un ojo en.

Por mucho que me hubiera gustado ver una guía definitiva a las cascadas que no he visto uno. Tal vez usted podría resumir algunas de las entradas de blog por ahí discutiendo cascadas con su propio puesto en su propio blog.

No sé ninguna guía "definitiva", pero el mejor recurso que sé es una entrada de blog de Ayende, que es uno de los gurús definitivas en NHibernate:

NHibernate cascadas: la diferencia entre todos, de todos los huérfanos eliminar y guardar actualización

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

.

respuesta aceptada explica en detalles con los archivos de HBM. Esta respuesta cubre la misma con el mapeo por el código. Ellos son casi iguales; simplemente asignada a sus cadenas HBM.

forma artículo Ayende lo explica así:

  
      
  • Ninguno -. No realice ninguna cascadas, dejar que los usuarios se ocupa de ellos por sí mismos
  •   
  • save-actualización -. Cuando se guarda el objeto / modificada, comprobar las asociaciones y guardar / actualizar cualquier objeto que lo requieran (incluyendo guardar / actualizar las asociaciones de muchos-a-muchos escenarios)
  •   
  • delete -. Cuando se elimina el objeto, eliminar todos los objetos en la asociación
  •   
  • delete-orphan - cuando se elimina el objeto, eliminar todos los objetos de la asociación. Además de que, cuando un objeto se elimina de la asociación y no se asocia con otro objeto (huérfanos), también eliminarlo.
  •   
  • todo -. Cuando un objeto es guardar / actualizar / borrar, verificar las asociaciones y guardar / actualizar / borrar todos los objetos encontrados
  •   
  • All-delete-orphan - cuando un objeto es guardar / actualizar / borrar, verificar las asociaciones y guardar / actualizar / borrar todos los objetos encontrados. En adicional a que, cuando un objeto se elimina de la asociación y no se asocia con otro objeto (huérfanos), también eliminarlo.
  •   

Además, esta pregunta explica algunas implementaciones internas de Cascade.

[Flags]
public enum Cascade
{
    None = 0,
    Persist = 2,
    Refresh = 4,
    Merge = 8,
    Remove = 16,
    Detach = 32,
    ReAttach = 64,
    DeleteOrphans = 128,
    All = 256,
}
private static IEnumerable<string> CascadeDefinitions(this Cascade source)
{
    if (source.Has(Cascade.All))
    {
        yield return "all";
    }
    if (source.Has(Cascade.Persist))
    {
        yield return "save-update, persist";
    }
    if (source.Has(Cascade.Refresh))
    {
        yield return "refresh";
    }
    if (source.Has(Cascade.Merge))
    {
        yield return "merge";
    }
    if (source.Has(Cascade.Remove))
    {
        yield return "delete";
    }
    if (source.Has(Cascade.Detach))
    {
        yield return "evict";
    }
    if (source.Has(Cascade.ReAttach))
    {
        yield return "lock";
    }
    if (source.Has(Cascade.DeleteOrphans))
    {
        yield return "delete-orphan";
    }
}

Tenga en cuenta que no incluye Cascade.All Cascade.DeleteOrphans. En ese caso, puede ser necesario incluirlo usando Cascade.All | Cascade.DeleteOrphans.

Como alternativa, puede utilizar el método de extensión Include Cascade.All.Include(Cascade.DeleteOrphans).

En combinación con Cascade, puede que tenga que mirar en Inverse así; especificó el titular de la asociación. Consulte esta pregunta para más detalles.

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