2008-10-28 10 views
12

Tengo una base de datos Oracle y uno de los campos es un campo de intervalo de fechas. Básicamente, se almacena en la base de datos como VARCHAR (40) en el formato AAAA/MM/DD-AAAA/MM/DD. Quiero hacer un mapa en NHibernate a una clase personalizada que he creado como estonAsignación de hibernación a tipos personalizados

public class DateTimeRange 
{ 
    public DateTimeRange(DateTime fromTime, DateTime toTime) 
    { 
     FromTime = fromTime; 
     ToTime = toTime; 
    } 

    public override string ToString() 
    { 
     return String.Format("{0} to {1}", FromTime.ToString("HH:mm:ss"), ToTime.ToString("HH:mm:ss")); 
    } 

    public DateTime FromTime { get; set; } 

    public DateTime ToTime { get; set; } 
} 

¿Cómo puedo asignar a clases personalizadas de este tipo?

Respuesta

17

Debe implementar su propio IUserType.

Consulte este blog post para más detalles. También pegaré la sección relevante a continuación en caso de que el blog desaparezca.

En NHibernate, un tipo de asignación personalizado es una clase que se deriva de las interfaces IUserType o ICompositeUserType. Estas interfaces contienen varios métodos que deben implementarse, pero para nuestros propósitos aquí, nos enfocaremos en 2 de ellos. Considera lo siguiente.

public class TypeClassUserType : IUserType 
    { 


    object IUserType.NullSafeGet(IDataReader rs, 
     string[] names, 
    object owner) { 

    string name = NHibernateUtil.String.NullSafeGet(rs, 
    names[0]) as string; 

    TypeClassFactory factory = new TypeClassFactory(); 
    TypeClass typeobj = factory.GetTypeClass(name); 
    return typeobj; 
    } 

    void IUserType.NullSafeSet(IDbCommand cmd, 
    object value, 
    int index) { 

     string name = ((TypeClass)value).Name; 
    NHibernateUtil.String.NullSafeSet(cmd, name, index); 
    } 
    } 

haber creado esta clase, que ahora puede asignar explícitamente la asociación entre ActualClass y clase de tipos como una simple propiedad en el mapeo ActualClass.

<property 
    name="Type" 
    column="TypeName" 
    type="Samples.NHibernate.DataAccess.TypeClassUserType, 
     Samples.NHibernate.DataAccess" /> 

Como NHibernate está en el proceso de guardar una instancia de ActualType, cargará y crear una nueva instancia de TypeClassUserType y llame al método nullSafeSet. Como puede ver en el cuerpo del método, simplemente estoy extrayendo el nombre de la propiedad mapeada (pasado como parámetro de valor) y estableciendo el nombre extraído como el valor del parámetro que se establecerá en la base de datos. El resultado neto es que, aunque la propiedad Type de ActualClass es TypeClass en el modelo de dominio, solo la propiedad Name del objeto TypeClass se almacena en la base de datos. Lo contrario también es verdad. Cuando NHibernate carga una instancia de ActualType de la base de datos y encuentra una propiedad de mi tipo de asignación personalizada, carga mi tipo personalizado y llama al método NullSafeGet. Como puede ver, mi método obtiene el nombre de los datos devueltos, llama a mi fábrica flyweight para obtener la instancia correcta de TypeClass, y luego realmente devuelve esa instancia. El proceso de resolución de tipo ocurre de manera transparente a mis clases de acceso a datos (e incluso a NHibernate en este caso).

+0

Hola TheSoftwareJedi, ¿podrías ayudarme a verificar el enlace que mencionaste en la publicación? no se encuentra. ¿Podría darnos un enlace disponible? Gracias. –

+0

Quité el enlace de la respuesta. No tengo otro enlace, e incluso anticipé el rompimiento del enlace ya que puse la sección relevante en el cuerpo de la respuesta. – TheSoftwareJedi

+0

https://web.archive.org/web/20100516024604/http://blogs.msdn.com/howard_dierking/archive/2007/04/23/nhibernate-custom-mapping-types.aspx –

Cuestiones relacionadas