Domanda

Ho un database Oracle e uno dei campi è un campo dell'intervallo di date. Fondamentalmente è appena archiviato nel database come VARCHAR (40) nel formato AAAA / MM / GG-AAAA / MM / GG. Voglio mapparlo in nHibernate a una classe personalizzata che ho creato in questo modo

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; }
}

Come posso mappare a classi personalizzate come questa?

È stato utile?

Soluzione

Devi implementare il tuo IUserType.

Vedi questo post di blog per dettagli. Incollerò anche la sezione pertinente di seguito nel caso in cui il blog scompaia.

In NHibernate, un tipo di mapping personalizzato è una classe che deriva dalle interfacce IUserType o ICompositeUserType. Queste interfacce contengono diversi metodi che devono essere implementati, ma per i nostri scopi qui, ci concentreremo su 2 di essi. Considera quanto segue.

  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);
    }
  }

Dopo aver creato questa classe, ora posso mappare esplicitamente l'associazione tra ActualClass e TypeClass come una semplice proprietà sulla mappatura ActualClass.

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

Poiché NHibernate sta salvando un'istanza di ActualType, caricherà e creerà una nuova istanza di TypeClassUserType e chiamerà il metodo NullSafeSet. Come si può vedere dal corpo del metodo, sto semplicemente estraendo il nome dalla proprietà mappata (passata come parametro valore) e impostando il nome estratto come valore del parametro da impostare nel database. Il risultato netto è che sebbene la proprietà Type di ActualClass sia TypeClass nel modello di dominio, solo la proprietà Name dell'oggetto TypeClass viene archiviata nel database. Anche il contrario è vero. Quando NHibernate sta caricando un'istanza di ActualType dal database e trova una proprietà del mio tipo di mapping personalizzato, carica il mio tipo personalizzato e chiama il metodo NullSafeGet. Come puoi vedere, il mio metodo prende il nome dai dati restituiti, chiama il mio flyweight factory per ottenere l'istanza corretta di TypeClass e quindi restituisce effettivamente quell'istanza. Il processo di risoluzione dei tipi avviene in modo trasparente con le mie classi di accesso ai dati (e persino con NHibernate stesso).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top