2009-07-09 10 views
2

Neu zu NHibernate und lernen, wie wir eine vorhandene Lösung ändern, um dieses ORM zu verwenden. Idealerweise müssen die Speicherstruktur und die Objektklassen gleich bleiben, weshalb ich auf ein oder zwei Zuordnungsprobleme stoße.NHibernate Mapping: UserTypes mit many-to-one

Eine Klasse "Geld" hat einen Wert und eine Währung. Der Wert ist ein Double und die Währung ist ein Fremdschlüssel für eine Listentabelle von Währungen.

Geld kann als ein Typ für viele Objekte/Tabellen erscheinen, daher habe ich einen CompositeUserType erstellt, um ihn zusammen mit einer Standardzuordnung zu Währung zuzuordnen. Das funktioniert gut, aber für das Leben von mir kann ich nicht die Währungsbeziehung zu Lazy Load von NHibernate bekommen. Wir benutzen fließend, aber ich freue mich über alle Hinweise in hbm.

Antwort

4

Sieht aus wie ich Komponenten verwenden müssen, kann nicht sehen, wie Referenzen von denen oder CompositeUserTypes hinzuzufügen, aber:/

https://forum.hibernate.org/viewtopic.php?f=1&t=947719&start=0

https://web.archive.org/web/20090227235136/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/08/13/a-fluent-interface-to-nhibernate---part-2---value.aspx

http://wiki.fluentnhibernate.org/show/StandardMappingComponents

UPDATE

Ich bin rund dieses Problem durch einen CompositeUserType verwenden und den Proxy-Endpunkt auf der Entität diring die NullSafeGet() -Methode der Einrichtung:

public virtual object NullSafeGet(IDataReader dr, string[] names, ISessionImplementor session, object owner) 
{ 
    if (dr == null) 
    { 
     return null; 
    } 

    Money value = new Money() 
    { 
     Value = (double)NHibernateUtil.Double.NullSafeGet(dr, names[0], session, owner) 
    }; 

    string entityName = session.BestGuessEntityName(value.Currency); 
    value.Currency = (CurrencyDetails)session.InternalLoad(entityName, (object)DEFAULT_CURRENCY_ID, false, false); 

    return value; 
} 

nicht sicher, ob dies ist der empfohlene Weg, es zu tun, aber es funktioniert :)

+0

einfach wollte erwähnen - füge keine 2 Antworten hinzu. Es ist genug mit einem - Bearbeiten Sie es, wenn etwas Neues gefunden wird. :) –

+1

Wie seltsam, dass nicht einen Tag später von Ihrem Posting, versuche ich, das * exakt gleiche * Problem zu lösen: ein Money-Typ, der einen Betrag hat und diesen Verweis auf eine Währung Entität will. Ich denke nicht, dass es ein ungewöhnliches Design ist. Ging den gleichen Weg zurück (CompositeUserType) und wurde über die Implementierung von NullSafeGet() verblüfft. Deine Lösung funktioniert! (Obwohl ich am Ende den entityName hartcodierte - nur das FQTN wie "MyNamespace.Currency".) Nicht sicher, ob es auch der beste Weg ist, aber hey, es funktioniert. Danke, dass du dir die Zeit genommen hast, deinen Beitrag mit einer Antwort zu aktualisieren! –

+0

Wie seltsam, froh zu helfen :) – theGecko