una tutorial sacar quitar parte objetos objeto letras imagen fondo eliminar dañar cómo cualquier cs5 con como capa borrar nhibernate

nhibernate - sacar - cómo borrar cualquier objeto en photoshop tutorial



¿Cómo eliminar un objeto secundario en NHibernate? (6)

Tengo un objeto principal que tiene una relación uno a muchos con un IList de objetos secundarios. ¿Cuál es la mejor manera de eliminar los objetos secundarios? No estoy eliminando el padre. Mi objeto primario contiene un IList de objetos secundarios. Aquí está el mapeo para la relación uno a muchos:

<bag name="Tiers" cascade="all"> <key column="mismatch_id_no" /> <one-to-many class="TGR_BL.PromoTier,TGR_BL"/> </bag>

Si trato de eliminar todos los objetos de la colección usando clear (), entonces llamo a SaveOrUpdate (), obtengo esta excepción:

System.Data.SqlClient.SqlException: Cannot insert the value NULL into column

Si trato de eliminar los objetos secundarios individualmente y luego eliminarlos del padre, recibo una excepción:

deleted object would be re-saved by cascade

Esta es la primera vez que trato de eliminar objetos secundarios en NHibernate. ¿Qué estoy haciendo mal?

editar: Solo para aclarar: NO trato de eliminar el objeto principal, solo los objetos secundarios. Tengo la relación establecida como uno a muchos en el padre. ¿También necesito crear una relación de muchos a uno en el mapeo de objetos hijo?


Cambia el valor del atributo en cascada de "todo" a "eliminar todo-huérfano".


De acuerdo con la respuesta de Chuck, resolví mi problema agregando Inverso = verdadero en el mapeo de los padres:

El mensaje tiene muchos MessageSentTo:

[HasMany(typeof(MessageSentTo), Cascade = ManyRelationCascadeEnum.AllDeleteOrphan, Inverse = true)] public IList<MessageSentTo> MessageSendTos { get { return m_MessageSendTo; } set { m_MessageSendTo = value; } }

Estoy usando Castle ActiveRecord. Gracias Chuck.


En nuestro ejemplo, tenemos categorías con muchos productos donde un producto no puede contener nulos.

Puede solucionar el problema eliminando el producto y quitándolo de la colección principal antes de la descarga, pero aún estamos buscando una mejor solución para esto.

product = pRepo.GetByID(newProduct.ProductID); product.Category.Products.Remove(product); pRepo.Delete(product);

Espero que ayude de todos modos


Está obteniendo el primer error porque, cuando elimina los elementos de la colección, el modo de funcionamiento predeterminado de NHibernate es simplemente romper la asociación. En la base de datos, NHibernate intenta establecer que la columna de la clave externa en la fila secundaria sea nula. Como no permite valores nulos en esa columna, SQL Server genera el error. La eliminación de la colección no necesariamente eliminará el objeto hijo, pero una forma de hacerlo es establecer cascade = all-delete-huérfano. Esto informa a NHibernate que debe eliminar las filas recientemente huérfanas en lugar de establecer la columna de clave externa.

Está recibiendo el segundo error porque cuando llama a SaveOrUpdate NHibernate primero elimina todos los objetos secundarios. Entonces, dado que ninguna de las relaciones está marcada como inversa, NHibernate también intenta establecer la columna de clave externa en su tabla secundaria como nula. Como las filas ya se han eliminado, recibirá el segundo error. Debes establecer inverse = true en un lado de tu relación para arreglar esto. Esto generalmente se hace en el lado de una (clave principal o padre). Si no hace esto, NHibernate hará las actualizaciones apropiadas para cada lado de la relación. Desafortunadamente, ejecutar dos actualizaciones no es lo apropiado.

Siempre debe marcar un lado de sus relaciones como el lado inverso. Dependiendo de cómo codifique, puede o no necesitar usar cascada. Si desea aprovechar la eliminación de una toma ya que está tratando de hacerlo con Clear (), necesita definir su cascada.


Intenta usar merge () en lugar de saveOrUpdate (). Además, asegúrese de que su cascada esté configurada como "eliminar todo-huérfano" y que su relación padre-hijo sea invertible (inverso = verdadero en el padre y luego un campo en el hijo que sea el padre-id con no-nulo = verdadero) .


establecer Not-Null = true en su asignación en la columna que causa el problema. Aunque no estoy seguro de la sintaxis exacta (lo siento).