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
