Hola Fabio:

Cuando me refiero a: "cuando elimino un elemento de la colección, le vuelvo
a agregar otro elemento con la misma unique key", quiero explicar lo
siguiente, lo voy a hacer con un ejemplo:

La clase LineaPlanActividad tiene una unique-key formada por los
atributos: PlanDeSiembra y Actividad.

Si tengo  :

lineaPlanActividad1.PlanDeSiembra = "Plan1"
lineaPlanActividad1.Actividad = "Actividad1"

 lineaPlanActividad2.PlanDeSiembra = "Plan1"
lineaPlanActividad2.Actividad = "Actividad1"

Y hago lo siguiente:

planDeSiembra.Remove(lineaPlanActividad1);
 planDeSiembra.Add(lineaPlanActividad2);
planDeSiembraService.guardar(planDeSiembra);

 Error: "System.Data.SqlClient.SqlException: Violation of UNIQUE KEY
constraint 'UQ__LineasPlanActivi__3D29E0FF'. Cannot insert duplicate key in
object 'dbo.LineasPlanActividad'"

Es el unico caso en el que da error. Puedo insertar y eliminar sin ningún
problema, excepto en el caso antes ejemplificado.

El equality comparer no lo estoy implementando, realmente nunca trabaje con
eso así que me voy a poner a investigar.

Muchas gracias por su ayuda.
Ezequiel






El 27 de julio de 2010 15:27, Fabio Maulo <[email protected]> escribió:

> mmmmm me parece que necesitas otra cosa.....
> que significa esto ?
>  "cuando elimino un elemento de la colección, le vuelvo a agregar otro
> elemento con la misma unique key"
>
> como están implementado el equality comparer ?
> para que metes el not-nullable a true ? a que te sirve ?
>
> 2010/7/27 Ezequiel Cozzolino <[email protected]>
>
>  Gracias por sus respuestas:
>>
>> Probé de poner el inverse="true", pero no funcionó. Probé lo siguiente:
>>
>> Creo el padre.
>>
>> Luego
>>
>> planDeSiembra.add(lineaPlanActividad)
>> padreService,guardar(planDeSiembra)
>>
>> Error: "System.Data.SqlClient.SqlException: Cannot insert the value NULL
>> into column 'IdPlanDeSiembra', table 'Intranet.dbo.LineasPlanActividad';
>> column does not allow nulls"
>>
>> Luego como me recomendó Diego Mijelshon hice la relación bidireccional.
>> Esto ultimo no me resuelve el problema cuando elimino un elemento de la
>> colección, le vuelvo a agregar otro elemento con la misma unique key que el
>> eliminado y guardo el padre. Al guardar el padre me da el error:
>>
>> planDeSiembra.remove(lineaPlanActividad)
>> planDeSiembra.add(lineaPlanActividad2) ==> en donde lineaPlanActividad2
>> tiene la misma unique-key que lineaPlanActividad
>> planDeSiembraService.guardar(planDeSiembra)
>>
>> Error: "System.Data.SqlClient.SqlException: Violation of UNIQUE KEY
>> constraint 'UQ__LineasPlanActivi__3D29E0FF'. Cannot insert duplicate key in
>> object 'dbo.LineasPlanActividad'"
>>
>>
>>
>> Saludos
>> Ezequiel
>>
>> El 27 de julio de 2010 11:08, Diego Mijelshon 
>> <[email protected]>escribió:
>>
>>  http://nhforge.org/doc/nh/en/index.html#collections-onetomany
>>>
>>> *Very Important Note:* If the <key> column of a <one-to-many> association
>>> is declared NOT NULL, NHibernate may cause constraint violations when it
>>> creates or updates the association. To prevent this problem, *you must
>>> use a bidirectional association* with the many valued end (the set or
>>> bag) marked asinverse="true". See the discussion of bidirectional
>>> associations later in this chapter.
>>>
>>>     Diego
>>>
>>>
>>> 2010/7/27 José F. Romaniello <[email protected]>
>>>
>>> proba así:
>>>>   <bag name="Actividades" table="LineasPlanActividad"
>>>> cascade="all-delete-orphan" *inverse="true"*>
>>>>
>>>>
>>>> El 27 de julio de 2010 10:35, Ezequiel Cozzolino <
>>>> [email protected]> escribió:
>>>>
>>>>  Hola a todos:
>>>>>
>>>>> Soy nuevo en NHibernate y me surgieron dos inconvenientes que paso a
>>>>> comentarles:
>>>>>
>>>>> Tengo una relación del tipo BAG entre las clases PlanDeSiembra y
>>>>> LineaPlanActividad. Muestro el segmento del archivo de mapeo de la clase
>>>>> PlanDeSiembra en donde hago la relación one-to-many con la clase
>>>>> LineaPlanActividad :
>>>>>
>>>>> <PlanDeSiembra.hbm.xml>
>>>>>
>>>>>   <bag name="Actividades" table="LineasPlanActividad"
>>>>> cascade="all-delete-orphan">
>>>>>       <key>
>>>>>         <column name="IdPlanDeSiembra" not-null="true"
>>>>> unique-key="PlanActividad" />
>>>>>       </key>
>>>>>       <one-to-many class="LineaPlanActividad"/>
>>>>>   </bag>
>>>>>
>>>>> Este mapeo me crea la columna IdPlanDeSiembra en la tabla
>>>>> LineaPlanActividad, lo cual es correcto.
>>>>>
>>>>> Primer inconveniente:
>>>>>
>>>>> Como la columna IdPlanDeSiembra no admite nulos da un error al intentar
>>>>> guardar una colección. En el log veo que NHibernate primero inserta los
>>>>> registros en la tabla LineasPlanActivdad con el campo IdPlanDeSiembra en
>>>>> nulo, y luego hace un update para guardar el valor de la columna
>>>>> IdPlanDeSiembra.
>>>>>
>>>>>
>>>>> Segundo inconveniente:
>>>>>
>>>>> Para probar saque el not-null="true" del archivo de mapeo de la clase
>>>>> PlanDeSiembra. Con esto puedo guardar la colección sin problemas. Comprobé
>>>>> que efectivamente NHibernate primero hace un insert con los hijos y luego
>>>>> hace un update de la columna que estabalece la relación de los hijos con 
>>>>> el
>>>>> padre.
>>>>>
>>>>> Hasta ahí el problema "estaría" solucionado, aunque no me convencía
>>>>> permitir valores nulos en la columna IdPlanDeSiembra en la tabla
>>>>> LineasPlanActividad.
>>>>>
>>>>> Hice otra prueba y fue ahí cuando me encontré con otro problema al
>>>>> realizar la siguiente secuencia de acciones:
>>>>>
>>>>> - Elimino un elemento de la colección ==> planDeSiembra.remove(linea)
>>>>> - Agrego un elemento a la colección con la misma unique-key que el
>>>>> elemento anterior que fue eliminado ==> planesDeSiembra.add(linea)
>>>>> - Guardo ==> planDeSiembraService.guardar(planDeSiembra)
>>>>>
>>>>> Me da un error ya que aparentemente NHibernate primero hace los insert
>>>>> y despues los delete, con lo cual al intentar guardar el elemento de la
>>>>> colección da un error por unique-key con el elemento que todavía no fue
>>>>> eliminado.
>>>>>
>>>>>
>>>>> Evidentemente algo estoy haciendo mal. Les voy a agradecer si me
>>>>> orientan un poco en como resolver este problema.
>>>>> Intente ser lo mas claro posible, si hace falta puedo enviar las clases
>>>>> y los archivos de mapeo completos.
>>>>>
>>>>> Muchas Gracias
>>>>> Ezequiel
>>>>>
>>>>> --
>>>>> Para escribir al Grupo, hágalo a esta dirección:
>>>>> [email protected]
>>>>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>>>
>>>>
>>>>   --
>>>> Para escribir al Grupo, hágalo a esta dirección:
>>>> [email protected]
>>>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>>>
>>>
>>> --
>>> Para escribir al Grupo, hágalo a esta dirección:
>>> [email protected]
>>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>>
>>
>> --
>> Para escribir al Grupo, hágalo a esta dirección:
>> [email protected]
>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>
>
>
>
> --
> Fabio Maulo
>
>   --
> Para escribir al Grupo, hágalo a esta dirección:
> [email protected]
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>

-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a