Pregunta

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 un VARCHAR (40) en el formato AAAA / MM / DD-AAAA / MM / DD. Quiero asignarlo en nHibernar a una clase personalizada que he creado como esta

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 asignarme a clases personalizadas como esta?

¿Fue útil?

Solución

Necesitas implementar tu propio IUserType.

Vea este publicación del blog para más detalles. También pegaré la sección correspondiente a continuación en caso de que el blog desaparezca.

En NHibernate, un tipo de mapeo personalizado es una clase que deriva de las interfaces IUserType o ICompositeUserType. Estas interfaces contienen varios métodos que deben implementarse, pero para nuestros propósitos aquí, nos centraremos 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);
    }
  }

Habiendo creado esta clase, ahora puedo asignar explícitamente la asociación entre ActualClass y TypeClass como una propiedad simple en el mapeo de 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 llamará al método NullSafeSet. Como puede ver en el cuerpo del método, simplemente estoy extrayendo el nombre de la propiedad asignada (pasado como parámetro de valor) y configurando el nombre extraído como el valor del parámetro a 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 cierto. Cuando NHibernate carga una instancia de ActualType de la base de datos y encuentra una propiedad de mi tipo de mapeo personalizado, 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 de peso mosca para obtener la instancia correcta de TypeClass y luego devuelve esa instancia. El proceso de resolución de tipos se realiza de forma transparente para mis clases de acceso a datos (e incluso para NHibernate).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top