Edgar, hay que tener en cuenta que la BD debe estar sincronizada con el mapeo que haces si no pueden ocurrir problemas como "ghost updates<http://fabiomaulo.blogspot.com/2008/10/how-test-your-mappings-ghostbuster.html>". Para esto existe el SchemaExport porque te genera los scripts asegurando la consistencia entre ambas partes. Cuando no exportas tu esquema desde NH entonces debes estar seguro que la estructura de tu BD concuerda con los archivos de mapeo. Es alli donde un SchemaValidator te serviria. Con respecto a el atributo not-null al igual que muchos otros como 'unique=true' o 'foreign-key' etc, son usados por NHibernate para generar el script de BD mas no para agregar algun comportamiento adicional. Es por esto que el not-null="false" no te funciona porque la responsabilidad de sincronizar la BD y los mapeos la has adquirido tu.
Saludos, Nestor Andres Rodriguez 2011/6/28 José F. Romaniello <[email protected]> > perdon cascade="persist" bastaría > > El 28 de junio de 2011 17:28, José F. Romaniello > <[email protected]>escribió: > > No tiene que ver lo que Fabio subió con esto Angel, lo que Fabio subió es >> para que cuando tenes un one-to-many ( en el ejemplo de Edgar no hay ninguno >> ) unidireccional (sin su many-to-one) solo se haga insert sin el update que >> antes nhibernate hacía. >> >> Estoy casi seguro que el problema de Edgar se debe a que no cumple la >> segunda regla de ORM; "consistencia en memoria", >> si vos guardas >> >> var retencion = new Retencion() ; >> var factura = new factura() { Retencion = retencion } ; >> session.save(factura); >> session.save(retencion); >> >> va a fallar. Tiene que estar apuntado desde los dos lugares, para que haga >> todo de una... y probablemente necesites cascade="all" >> >> Para mantener el encapsulamiento, te sugiero utilizar un custom setter en >> alguna de las dos propiedades. >> >> Y preguntate si lo que necesitas no es una one-to-one en lugar de una >> many-to-one ;) >> >> >> >> >> >> El 28 de junio de 2011 17:16, Angel Java Lopez >> <[email protected]>escribió: >> >> Hola gente! >>> >>> Hmm... Edgar, el requerimiento de FacturaId como nullable, parece >>> relacionado con: >>> >>> http://msmvps.com/blogs/lopez/archive/2011/05/23/nhibernate_2D00_3_2D00_part_2D00_6_2D00_one_2D00_to_2D00_many_2D00_with_2D00_many_2D00_to_2D00_one.aspx >>> >>> donde se envian dos comandos (INSERT y UPDATE) por cada entidad "hija". Y >>> que el campo BookId queda con valor nulo en el insert. La doc de NHibernate >>> indica que tiene que ser nullable, pero no queda muy claro por que. >>> >>> En >>> >>> http://msmvps.com/blogs/lopez/archive/2011/05/30/nhibernate_2D00_3_2D00_part_2D00_7_2D00_one_2D00_to_2D00_many_2D00_with_2D00_inverse.aspx >>> desaparecio el problema con un atribute inverse, pero no se si se aplica >>> a tu caso. >>> >>> Entiendo que hace una semana, Fabio Maulo envio al trunk codigo que evita >>> el INSERT y el UPDATE, y hace solo Update. Con lo que la necesidad de tener >>> BookId (O FacturaId en tu caso) como nullable, ya no es mas. >>> >>> Nos leemos! >>> >>> Angel "Java" Lopez >>> http://www.ajlopez.com >>> http://twitter.com/ajlopez >>> >>> >>> 2011/6/28 Edgar Ramos <[email protected]> >>> >>>> Nestor lo habia probado como not-null="false" y el error era el mismo. y >>>> de hecho mo lo decia antes sin cambiar nada en mis mappings y unicamente >>>> habilitando "FacturaId" como null = "true" funciona muy bien. >>>> >>>> La pregunta que se me plantea es si dejo tal cual como esta funcionando >>>> "FacturaId" como null = "true", y los mappings sin tocarlos, es correcto lo >>>> que estoy haciendo, la verdad me confundi un poco >>>> >>>> Saludos >>>> >>>> Edgar >>>> >>>> El esquema no lo genero con SchemaExport, >>>> >>>> El 28 de junio de 2011 14:25, Nestor Andres Rodriguez < >>>> [email protected]> escribió: >>>> >>>> De todas maneras debes agregar el not-null = "false" en <many-to-one >>>>> name="FacturaAplicada" class="Factura" column="FacturaId" not-null = >>>>> "false"/>. >>>>> >>>>> Umm ... siempre me confundo con el not-null = "true/false" diria que >>>>> seria mas intuitivo si dijera nullable="true/false"... En fin prueba y me >>>>> cuentas. >>>>> >>>>> En caso de que no estes generando el esquema con el SchemaExport >>>>> entonces debes correr un script en la BD que cambie la llave foranea >>>>> "FacturaId" como null = "true". >>>>> Saludos, >>>>> Nestor Rodriguez >>>>> 2011/6/28 Nestor Andres Rodriguez <[email protected]> >>>>> >>>>>> Estas generando el script desde NH con SchemaExport ? >>>>>> >>>>>> >>>>>> 2011/6/28 Edgar Ramos <[email protected]> >>>>>> >>>>>>> Gente un Saludo >>>>>>> >>>>>>> Me he liado un poco con la relacion de estos objetos >>>>>>> >>>>>>> Factura y Retencion >>>>>>> >>>>>>> A una Factura le corresponde una retencion, siempre y cuando el >>>>>>> cliente lo exija, caso contrario no aplica, para este efecto >>>>>>> >>>>>>> >>>>>>> Mis clases >>>>>>> >>>>>>> public class Factura >>>>>>> { >>>>>>> ....... >>>>>>> public virtual RetencionFuenteVenta Retencion { get; set; } >>>>>>> ....... >>>>>>> } >>>>>>> >>>>>>> public class RetencionFuenteVenta >>>>>>> { >>>>>>> ........ >>>>>>> public virtual Factura FacturaAplicada { get; set; } >>>>>>> ...... >>>>>>> } >>>>>>> >>>>>>> Mis mappings >>>>>>> >>>>>>> <class name="RetencionFuenteVenta"> >>>>>>> <id name="Id"> >>>>>>> <generator class="hilo"/> >>>>>>> </id> >>>>>>> >>>>>>> ......... >>>>>>> <many-to-one name="FacturaAplicada" class="Factura" >>>>>>> column="FacturaId" /> >>>>>>> </class> >>>>>>> >>>>>>> <class name="Factura"> >>>>>>> <id name="Id"> >>>>>>> <generator class="hilo"/> >>>>>>> </id> >>>>>>> >>>>>>> <many-to-one name="Retencion" class="RetencionFuenteVenta" >>>>>>> column="RetencionId" cascade="all" /> >>>>>>> </class> >>>>>>> >>>>>>> En el esquema de la bdd, la tabla Factura tiene el campo RetencionId >>>>>>> como permitir valores nulos, que para mi >>>>>>> caso es lo que requiero. >>>>>>> Por otro lado La tabla RetencionFuenteVenta, campo FacturaId, tiene >>>>>>> tambien permitir valores nulos, no me parece >>>>>>> que sea lo correcto, pero lo puesto asi para que nh persista estas >>>>>>> entidades y lo hace sin problemas >>>>>>> >>>>>>> Pero al quitar de RetencionFuenteVenta, campo FacturaID el permitir >>>>>>> valores nulos, nh me tira un error >>>>>>> ------------------------------- >>>>>>> {"No se puede insertar el valor NULL en la columna 'FacturaID', tabla >>>>>>> 'RetencionFuenteVenta'. La columna no admite valores NULL. INSERT >>>>>>> falla.\r\n >>>>>>> Se terminó la instrucción."} >>>>>>> --------------------------------- >>>>>>> >>>>>>> Cualquier comentario o sugerencia les estoy muy agradecido >>>>>>> >>>>>>> Saludos >>>>>>> >>>>>>> Edgar >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> 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 >>> >> >> > -- > 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
