2009-06-12 10 views
8

Estoy desarrollando una aplicación de muestra para que pueda conocer los pormenores de NHibernate. Estoy luchando con un problema de eliminación. Deseo poder eliminar un registro secundario quitándolo de la colección principal y luego guardando el padre. He configurado una relación bidireccional de uno a muchos y la inserción/actualización funciona muy bien.Eliminar un registro secundario de la colección principal

Éstos son mis asignaciones

Cesta:

<bag name="Items" inverse="true" cascade="all"> <key column="BasketId" /> <one-to-many class="BasketItem" /> </bag>

BasketItem:

<many-to-one not-null="true" name="Basket" column="BasketId" />

quisiera llamar basket.RemoveBasketItem(BasketItem item) continuación Session.SaveUpdate(basket) de manera que se elimina el elemento de la cesta . es posible?

Respuesta

16

Cambie cascade="all" en cascade="all-delete-orphan".

cascade="all" solo eliminará sus registros secundarios si el padre se elimina.

+0

Cuando mi RemoveBasketItem se ve así: this.basketItems.Remove (itemToRemove); Me sale este error: una colección con cascada = "todo-eliminar-huérfano" ya no era referenciada por la instancia de la entidad propietaria: Basket.Items –

+7

Parece que sobrescribió de algún modo la referencia 'IList' que contiene los artículos de su cesta. Solo puede poner su propia implementación de 'IList' allí cuando la referencia de la lista sea nula: si carga una cesta desde el DB, NH colocará su propio' PersistentBag' como la implementación 'IList', y debe dejar esta referencia solo para que la cascada funcione correctamente. – mookid8000

+1

¡Lo tengo para trabajar! Gracias por su ayuda :-) Estaba teniendo problemas porque mi propiedad basket.Items estaba renovando una lista de solo lectura. Ahora simplemente estoy devolviendo la instancia privada de mis artículos. –

2

Tengo el mismo escenario y he utilizado cascade = "all-delete-huérfano" en bagList pero cuando elimino un elemento hijo único en una colección, también elimina el objeto principal.

+1

Asegúrese de que su objeto secundario tenga cascada = "ninguno" –

+0

Gracias por el comentario .... este es el eslabón perdido en la mayoría de las entradas en línea !!! – Jonathan

+0

+1 millón, me ayudó donde la mayoría de los recursos en línea no mencionan, como dijo Jonathan. ¡Gracias! –

0

Estaba teniendo el mismo problema que initforthemoney debido a que devolví una nueva lista como ReadOnly de mi colección getter. Encontré que podía seguir utilizando la lista de solo lectura al cambiar la estrategia de acceso a la propiedad de la colección de nosetter a field.

0

Estaba teniendo un problema donde los elementos de mis hijos devolvían un enumerable ordenado.

private readonly IList<Child> children; 

public virtual IEnumerable<Child> Children { get { return children.OrderBy(c => c.Position); } } 

public virtual void DeleteChild(Child item) 
{ 
    children.Remove(item); 
} 

Moví el pedido a mi asignación y devolvió los elementos secundarios como lo está para IEnumerable. ¡Esto funcionó para mí!

Cuestiones relacionadas