Pregunta

Tengo una asociación muchos-a-muchos entre listas y ListItems: una Lista conoce sus artículos, sino un ListItem no sabe nada de las listas que contienen. La cascada es saveupdate.

Así, cada vez que estoy tratando de eliminar una entidad ListItem, estoy recibiendo una excepción de SQL diciendo que estoy rompiendo la integridad referencial. NHibernate intenta eliminar mi ListItem sin eliminar la fila correspondiente en la tabla de vinculación. La pregunta es, ¿es posible instruir a NHibernate suprimir mi ListItem sin romper la integridad referencial?

En caso de que tenga que quitar manualmente el elemento de todas las listas que contienen, ¿cómo lo hago correctamente que?

Muchas gracias por cualquier consejo.

ulu

¿Fue útil?

Solución

Debe establecer mapas en el niño a inverse=true. De otro hilo :

Cuando se llama a saveOrUpdate NHibernate primero elimina todos los niños objetos. Entonces, porque ni relación está marcada como inversa, NHibernate también trata de establecer el columna de clave externa en la tabla de niño a nulo. Desde las filas ya tienen sido eliminado, recibirá el segundo error. Es necesario configurar inversa = true en un lado de su relación con la solución esta. Esto se hace generalmente por una lateral (clave principal o matriz). Si tu no haga esto, hará que NHibernate las actualizaciones adecuadas para cada lado de la relación.

public class StoreMap : ClassMap<Store>
{
  public StoreMap()
  {
    Id(x => x.Id);
    Map(x => x.Name);
    HasMany(x => x.Staff)
      .Inverse()         // Magic code!
      .Cascade.All();
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top