2010-03-09 12 views
5

Ist es möglich, eine globale umgekehrte Suche auf von NHibernate verwalteten Objekten durchzuführen?Globale Objektreferenzen in NHibernate finden

Insbesondere habe ich eine persistente Klasse namens "Io". Es gibt eine große Anzahl von Feldern in mehreren Tabellen, die möglicherweise ein Objekt dieses Typs enthalten können. Gibt es eine Möglichkeit (bei einer bestimmten Instanz eines Io-Objekts), eine Liste von Objekten (beliebigen Typs) abzurufen, die tatsächlich auf dieses bestimmte Objekt verweisen? (Bonuspunkte, wenn angegeben werden kann, welche spezifischen Felder tatsächlich die Referenz enthalten, aber das ist nicht kritisch.)

Da die NHibernate-Zuordnungen alle Verknüpfungen definieren (und die zugrunde liegende Datenbank über entsprechende Fremdschlüsselverbindungen verfügt), sollte angegeben werden einige Weg, es zu tun.

diese Art von Struktur Stellen Sie sich vor:

class Io 
{ 
    public int Id { get; set; } 
    // other fields specific to the Io type 
} 

class ThingOne 
{ 
    public int Id { get; set; } 
    public Io SensorInput { get; set; } 
    public Io SolenoidOutput { get; set; } 
    // other stuff 
} 

class ThingTwo 
{ 
    public int Id { get; set; } 
    public Io SensorInput1 { get; set; } 
    public Io SensorInput2 { get; set; } 
    public SubThing Doohickey { get; set; } 
    // ... 
} 

class SubThing 
{ 
    public int Id { get; set; } 
    public Io ControlOutput1 { get; set; } 
    // ... 
} 

eine bestimmte Instanz von Io gegeben, möchte ich feststellen, dass es 12 von der ThingTwo mit id bezeichnet ist, oder dass es mit durch das und auch durch die ThingOne referenziert ist ID 16. Wenn möglich, auch, dass die erste Referenz zum Beispiel über SensorInput2 erfolgt.

Antwort

3

Nun scheinen die Konfigurationszuordnungen die FK-Beziehung nicht zu offenbaren, so dass eine Reflektion vorläufig feststellen kann, welches Objekt die Typen referenziert. Beachten Sie, dass der folgende Code annimmt, dass Sie alle nhibernate-mapped Klassen in einer einzelnen Assembly haben und C# 3.0 und darüber für die Unterstützung von LINQ außerdem verwenden.

IO toSearch = nhSession.Get<IO>(5); 
var assembly = Assembly.Load("EntityAssembly"); 
IList<Type> assemblyTypes = assembly.GetTypes(); 
var searchType = toSearch.GetType(); 
var typesThatContainedSearchTypeProperty = 
    assemblyTypes.Where(
    ast => ast.GetProperties().Count() > 0 && 
    ast.GetProperties().Where(
     astp => astp.PropertyType != null && astp.PropertyType == searchType).Count() > 0); 

Nun, wenn Sie wollen auch die Objekte erhalten, die diese bestimmte Instanz IO enthalten können Sie eine schöne mehrkriteriellen haben es in einer einzigen Hin- und Rückfahrt zu tun.

wie Sie erraten können, da wir mit der Reflexion beginnen, können wir nur mit Reflexion enden. Die Ergebnisliste ist ein Array mit jedem Eintrag als Ergebnis der einzelnen Kriterien, wobei jede Kriteriensuche ein einzelnes Ergebnis oder eine Ergebnisliste sein kann.

+0

Zuerst gab mir das einige Probleme, aber das stellte sich als Fehler in meinen hbm-Mappings heraus. Nachdem ich das Ergebnis in eine einzige Liste verflacht habe, macht dies genau das, was ich wollte. Vielen Dank! – Miral

+0

Es ist so schön, aber man sollte sich ** toSearch.GetType() ** bewusst sein. Es kann das Proxy-Objekt anstelle des echten Objekts zurückgeben. –

+0

@ S.M.Amin mischen Sie Get() mit Load().Get() wird keinen Proxy zurückgeben, Load() wird – Jaguar

0

Enthält Ihre "lo" -Klasse keinen Verweis auf Objekte, die das Objekt "lo" enthalten?

dh wenn „Lo“ ist Referenz durch eine bestimmte Anzahl von „Hallo“ Objekte:

public class Lo 
{ 
    List<Hi> hiObjects; 
} 

Nun, wenn Sie eine Instanz von „Lo“ haben:

Lo lo = new Lo(); 
List<Hi> hiObjects = lo.hiObjects; 

Wenn Sie nicht über Diese Art von Referenzen können Sie hinzufügen.

+0

Nur wenn es einen Weg für NHibernate gibt, diese Informationen für mich zu füllen. Es gehört definitiv nicht in den permanenten Zustand - das sind Informationen, die beim Erstellen des Objektgraphen wiederhergestellt werden. Ich habe meine Frage um ein Beispiel erweitert, das die Dinge hoffentlich besser erklärt. – Miral

+0

Bei der aktuellen Zählung gibt es ungefähr 20 verschiedene Typen, die einen Io enthalten könnten. Ich möchte sie also nirgendwo explizit aufführen müssen. – Miral

Verwandte Themen