Frage

Ich habe eine Oracle -Datenbank und eines der Felder ist ein Datumsbereichsfeld. Es wird im Grunde genommen nur in der Datenbank als Varchar (40) im Format yjyy/mm/dd-yjyy/mm/dd gespeichert. Ich möchte es in Nhibernate auf eine benutzerdefinierte Klasse zuordnen, die ich so erstellt habe

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

Wie kann ich solche benutzerdefinierten Klassen zuordnen?

War es hilfreich?

Lösung

Sie müssen Ihr eigenes iusertype implementieren.

Sieh dir das an Blogeintrag für Details. Ich werde auch den entsprechenden Abschnitt unten einfügen, falls der Blog verschwindet.

In NhiberNate ist ein benutzerdefinierter Mapping -Typ eine Klasse, die entweder von den Schnittstellen von Iusertype oder icompositeusertype stammt. Diese Schnittstellen enthalten verschiedene Methoden, die implementiert werden müssen, aber für unsere Zwecke hier konzentrieren wir uns auf zwei von ihnen. Folgendes berücksichtigen.

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

Nachdem ich diese Klasse erstellt habe, kann ich jetzt explizit die Assoziation zwischen tatsächlicher Klasse und Typeclass als einfache Eigenschaft für die tatsächliche Klassenzuordnung abbilden.

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

Da NhiberNate dabei ist, eine Instanz von tatsächlicher Art zu speichern, wird es geladen und eine neue Instanz von TypeClassSertype erstellt und die NullSafeset -Methode aufgerufen. Wie Sie aus der Method -Karosserie sehen können, extrahiere ich einfach den Namen aus der zugeordneten Eigenschaft (übergeben als Wertparameter) und setze den extrahierten Namen als Wert des in der Datenbank festgelegten Parameters ein. Das Nettoergebnis ist, dass die Typ -Eigenschaft der tatsächlichen Klasse zwar im Domänenmodell typisch ist, nur die Namenseigenschaft des Typs des TypsClass -Objekts in der Datenbank gespeichert wird. Das Gegenteil ist auch wahr. Wenn NhiberNate eine Instanz von tatsächlicher Art aus der Datenbank lädt und die Eigenschaft meines benutzerdefinierten Mapping -Typs findet, lädt er meinen benutzerdefinierten Typ und ruft die NullSafeGet -Methode auf. Wie Sie sehen können, erhält meine Methode den Namen aus den zurückgegebenen Daten, ruft meine Fliegengewichtsfabrik auf, um die richtige Instanz der TypeClass zu erhalten, und gibt diese Instanz dann tatsächlich zurück. Der Typ -Auflösungsprozess findet transparent zu meinen Datenzugriffsklassen (und sogar für Nhibernate selbst).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top