Me agrada que te haya servido. Sin embargo me surge la duda acerca de lo que dices al final de que "*lo ideal es verificar primero que el registro no exista en la tabla*". Creo que esa es una verificacion que no deberias hacer, pues la idea de utilizar el unsave-value es precisamente informarle a NHibernate si debe realizar un update o un insert sin tener que ir a preguntar a la base de datos.
Cuando he tenido que trabajar con identificadores asignados lo que mejor me ha dado resultado es el uso de un interceptor. En http://www.nhforge.org/doc/nh/en/index.html en la seccion 19.1 puedes leer como funciona el interceptor por medio del metodo IsTransient(). Cuentanos como te va. Saludos, Nestor Rodriguez 2010/9/22 Google Cris <[email protected]> > Hola que tal, yo nuevamente > > Bueno Nestor, pude solucionar el problema, revise la documentacion de > los puntos 5.1.4.6 y 7.4 que me mencionaste y me ayudo mucho. Muchas > gracias por la ayuda :D > > Ahora cuento la historia por si a alguien le da el mismo problema. > > Revise el archivo nhibernate-mapping.xsd de nhibernate, busque la > parte de composite-id especificamente el unsaved-value, este segun el > archivo me permite colocar dos valores, (none o any), con ambos probe, > compile el hibernate una vez hecho el cambio y aun con el > (SaveorUpdate) me mandaba a actualizar en vez de guardar. > > Tambien probe la opción de colocar en la estructura con id compuesto > el campo <version name="LastModifiedOn" column="LastModifiedOn" > type="timestamp" />, en este caso si me mando a guardar en vez de > actualizar, pero no me gustaba la idea de agregar ese campo > "LastModifiedOn" a mi tabla, ademas que me daba otro error de fuera de > indices > > :S > > "Index was out of range. Must be non-negative and less than the size > of the collection." al momento de > > Entonces continue la busqueda y encontre un ejemplo en el grupo con > esta opción: > > > http://groups.google.com.ar/group/nhibernate-hispano/browse_thread/thread/20171bd616889cc6/ff5ca6272c472e6c?lnk=gst&q=composite-id+guillermo#ff5ca6272c472e6c > > Con lo cual pude cambiar mi estructura a como indica Guillermo en el > ejemplo "TestConn.zip" y me quedo asi: > > Clase: TipoListado > > > <?xml version="1.0" encoding="utf-8" ?> > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" > namespace="PDVSA.Negocio.Entidades.Base" > assembly="Entidades.Base" > default-lazy="true"> > <meta > attribute="extends">PDVSA.Business.Entities.Core.AbstractEntity</meta> > <meta attribute="extends- > composite">PDVSA.Business.Entities.Core.CompositeID</meta> > <meta attribute="generate-typeconverter"></meta> > > <class name="PDVSA.Negocio.Entidades.Base.TipoListado, > Entidades.Base" table="T_TipoListado"> > > <composite-id unsaved-value="any"> > <key-property name="PK_CodigoTipoListado" > column="PK_CodigoTipoListado" type="Int64" /> > <key-property name="PK_CodigoListado" column="PK_CodigoListado" > type="Int64" /> > </composite-id> > > <property name="DescripcionTipoListado" > column="DescripcionTipoListado" type="String" length="100"> > <meta attribute="field-browsable">true</meta> > <meta attribute="field-readonly">false</meta> > <meta attribute="field-category">GeneralCategory</meta> > <meta attribute="field-propertysort">3</meta> > </property> > > </class> > > </hibernate-mapping> > > ------------------------------------- > > Clase: Listado > > <?xml version="1.0" encoding="utf-8" ?> > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" > namespace="PDVSA.Negocio.Entidades.Base" > assembly="Entidades.Base" > default-lazy="true"> > <class name="PDVSA.Negocio.Entidades.Base.Listado" > table="T_Listado"> > > <meta > attribute="extends">PDVSA.Business.Entities.Core.AbstractEntity</meta> > <meta attribute="default-property-tostring">DescripcionListado</ > meta> > <meta attribute ="generate-typeconverter"></meta> > > <id name="ID" column="PK_CodigoListado" type="Int64" unsaved- > value="0"> > <meta attribute="field-browsable">false</meta> > <meta attribute="field-readonly">true</meta> > <meta attribute="field-category">GeneralCategory</meta> > <meta attribute="field-propertysort">1</meta> > <generator class="sequence"> > <param name="sequence">T_Listado_PK_CodigoListado_seq</param> > </generator> > </id> > > <property name="DescripcionListado" column="DescripcionListado" > type="String" length="100"> > <meta attribute="field-browsable">true</meta> > <meta attribute="field-readonly">false</meta> > <meta attribute="field-category">GeneralCategory</meta> > <meta attribute="field-propertysort">2</meta> > </property> > > <bag name="TipoListados" table="T_TipoListado" inverse="true"> > <key foreign-key="PK_CodigoListado" column="PK_CodigoListado"/ > > > <one-to-many class="PDVSA.Negocio.Entidades.Base.TipoListado, > Entidades.Base" /> > </bag> > > </class> > </hibernate-mapping> > > Teniendo en cuenta unsaved-value="any" en el composite-id de la clase > TipoListado > > Genere la base de datos e inclui algunos datos en T_Listado > > Hice una prueba de inserción bastante simple y funciono: > > // PRUEBA SIMPLE PARA AGREGAR AL COMPOSITE-ID > Listado clsListado = sessionContext.GetById<Listado>((long)1); > TipoListado clsTipoListado = new TipoListado(); > clsTipoListado.PK_CodigoListado = clsListado.ID; > clsTipoListado.PK_CodigoTipoListado = 63; > clsTipoListado.DescripcionTipoListado = "prueba"; > sessionContext.SaveOrUpdate<TipoListado>(clsTipoListado); > > Claramente para insertar un valor nuevo, lo ideal es verificar primero > que el registro no exista en la tabla de la base de datos, pues en > este caso se haria una actualización en vez de una inserción. > > Gracias por la ayuda :) > > -- > 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
