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

Responder a