El POID seria "identitty" o "hilo"asi que este no lo modificaria.  Lo que
modificaria es la transformacion del INT/LONG que viene de la BD a un GUID
que esta como tipo de la propiedad de la clase.  Como un Int/long ocupa 4/8
bytes entonces este lo puedo usar para armar un GUID de 16 bytes (quedarian
8bytes restantes); esta conversion es suficiente para asegurar unicidad
entre instancias del la misma entidad pero no es suficiente entre
instancias de diferente entidades de igual manera que ocurre con los Ids
que son enteros (son unicos por tabla pero no entre tablas).  Entonces para
poder hacer este GUID un poco mas fuerte entre instancias de diferente
entidades la idea es usar el HashCode de la entidad
(typeof(entidad).FullName.Hashcode()) para llenar otros 8bytes restantes.
Por tal motivo requiero saber el System.Type (o inclusive el nombre de la
Tabla) de la entidad cuando estoy convirtiendo de Int a Guid en el
IUserType.

Mi problema es entonces como obtener la informacion de la entidad a la que
le estoy haciendo la conversion de Int -> Guid.  Como explique
anteriormente esperaba obtener la instancia de la entidad en el metodo
NullSafeGet en el parametro "owner" pero este es enviado como NULL
internamente en NHibernate.  La pregunta es como puedo obtener la
informacion de la entidad en el IUserType y si no es posible entonces que
otra estrategia se les ocurre para realizar esto.

Este es el codigo para convertir de dos numeros Long a Guid y viceversa, el
primer Long se armaria con el typeof(entidad).FullName.Hashcode() y el otro
Long seria con el Id que viene de la BD ya sea Int o Long, el otro metodo
retorna los Longs usados para armar el Guid de los cuales solo es util para
la BD el longArray[1]:

public static Guid ToGuid(long val1, long val2)
        {
            var bytes = new byte[16];
            Array.Copy(BitConverter.GetBytes(val1), bytes, 8);
            Array.Copy(BitConverter.GetBytes(val2), 0, bytes, 8, 8);
            return new Guid(bytes);
        }

 public static long[] ToLongArray(Guid guid)
        {
            var bytes = guid.ToByteArray();
            var longArray = new long[2];
            longArray[0] = BitConverter.ToInt64(bytes, 0);
            longArray[1] = BitConverter.ToInt64(bytes, 8);
            return longArray;
        }

Gracias por su colaboracion.  Cualquier idea es bienvenida.

2012/4/7 Fabio <[email protected]>

> Para que es?
> Para luego usarlo como POID ?
> Ponele que logras leer, como vas a generar un ID univoco con ese metodo ?
>
> El martes, 3 de abril de 2012 01:32:30 UTC-3, Andres Rodriguez escribió:
>
>> Buen Dia,
>>
>> Me encuentro haciendo un IUserType el cual obtiene un entero de la BD y
>> lo convierte en un GUID y viceversa (si, suena extraño pero asi es).  El
>> Guid es de 16 bytes y un Int 4, entonces alli encaja!. Para llenar los 12
>> bytes restante voy a utilizar el hashcode del tipo de la clase ( i.e.
>> typeof(theClass).HashCode()) para simular de cierta manera la unicidad del
>> Guid.  Estoy utilizando un IUserType para dicha tarea pero no he encontrado
>> la manera para poder acceder a la clase donde se mapeo el IUserType.  En
>> principio pense que se podria acceder a traves del parametro "object owner"
>> del metodo NullSafeGet y luego con un owner.GetType obtendria el
>> System.Type, pero verificando en el codigo esta propiedad viene NULL desde
>> NHibernate.  Es por esto que les escribo para saber como puedo conocer la
>> clase en donde se esta utilizando el custom IUserType.
>>
>> Por el momento me ha funcionado utilizando un IPropertyAccessor con
>> IGetter y ISetter personalizados pero unicamente para guardar.  El
>> inconveniente es que esta estrategia no es util para hacer el Get o un
>> QueryOver por Id pues no convierte el GUID en Int en el SQL query que envia
>> a la BD, pero si tuviera el IUserType estoy seguro (90%) que esto no
>> sucederia pues NHibernate trataria primero de convertir el GUID a un Int
>> pues detectaria que la propiedad esta mapeada con un IUserType.
>>
>> Bueno agradezco cualquier idea u opinion al respecto.
>>
>> Atentamente,
>> Nestor Andres Rodriguez
>>
>  --
> 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