2009-07-09 10 views
2

Nouveau pour NHibernate et l'apprentissage que nous modifions une solution existante pour utiliser cet ORM. Idéalement, la structure de stockage et les classes d'objets doivent rester les mêmes, donc j'ai rencontré un ou deux problèmes de mappage.NHibernate mapping: UserTypes avec many-to-one

Une classe 'Money' a une valeur et une devise. La valeur est un double et la devise est une clé étrangère à une table de liste de devises.

L'argent peut apparaître comme un type sur plusieurs objets/tables, j'ai donc créé un CompositeUserType pour le mapper avec un mappage standard vers la devise. Cela fonctionne très bien, mais pour la vie de moi, je ne peux pas obtenir la relation de devise à la charge paresseux de NHibernate. Nous utilisons couramment, mais je suis heureux pour les pointeurs dans hbm.

Répondre

4

On dirait que je dois utiliser des composants, ne peut pas voir comment ajouter des références de ceux ou CompositeUserTypes, bien que/

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

MISE À JOUR

J'ai arrondi ce problème en utilisant un CompositeUserType et la mise en place du point de terminaison proxy sur l'entité diring la méthode NullSafeGet():

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

Je ne sais pas si cela est la méthode recommandée de le faire, mais cela fonctionne :)

+0

Juste voulait mentionner - n'ajoutez pas 2 réponses. C'est assez avec un - éditez-le si vous trouvez quelque chose de nouveau. :) –

+1

Comme il est étrange que pas un jour plus tard de votre publication, j'essaie de résoudre le * même problème * même: un type d'argent qui a un montant et veut cette référence à une entité monétaire. Je ne pense pas que ce soit un design inhabituel. Je suis descendu le même chemin que vous avez fait (CompositeUserType) et vous êtes tombé sur comment implémenter NullSafeGet(). Votre solution fonctionne! (Bien que j'ai fini par coder en dur l'entityName - juste le FQTN comme "MyNamespace.Currency".) Je ne sais pas si c'est la meilleure façon non plus, mais bon, ça marche. Merci d'avoir pris le temps de mettre à jour votre message avec une réponse! –

+0

Comment étrange, heureux d'aider :) – theGecko