2009-02-26 15 views
0

S'il vous plaît aidez-moi - je suis nouveau à NHibernate et je n'arrive pas à trouver ce que je cherche. J'ai deux tables dans une base de données: Fund et FundBalance. Un Fund peut avoir plusieurs FundBalances et un FundBalance a seulement un Fund.NHibernate cartographie après une normalisation

En C#, il n'y a que la classe FundBalance. Les colonnes de la table Fund jointes aux colonnes de la table FundBalance doivent être mappées sur les propriétés de la classe FundBalance.

Par exemple, la table Fund contient la propriété FundName et la table FundBalance contient la propriété AvailableBalance. Ces deux tables sont jointes et le résultat de la jointure doit être mappé aux propriétés FundName et AvailableBalance de la classe FundBalance.

La question: comment faire avec NHibernate? Bonus: Comment spécifier le mappage à l'aide de FluentNHibernate?

Une solution que je pensais était de créer une vue dans la base de données, mais je préférerais que la mise en correspondance peut être fait uniquement à l'aide NHibernate.

+0

Qu'est-ce qui se trouve dans la classe FundBalance à partir des données provenant du tableau FundBalance, étant donné qu'un Compartiment peut avoir plusieurs FondsBalance? Ensuite, à quoi ressemble votre classe FundBalance, et qu'est-ce qui s'y passe exactement? –

Répondre

0

Quelle est la raison pour laquelle vous n'avez pas de catégorie de fonds? Je repenserais si c'est vraiment sage.

Mais si vous voulez rester sur cette route, l'attribut subselect pourrait aider (désolé je ce des Hibernate docs pas NHibernate, mais j'espère qu'ils sont similaires assez: http://www.hibernate.org/hib_docs/core/reference/en/html_single/#mapping-declaration-class)

Je pense que ce devrait travailler pour pour sélectionner, mettre à jour et supprimer. Mais je n'ai aucune idée comment insert devrait fonctionner (indépendamment de Hibernate) qui devrait être responsable de décider si vous avez besoin d'un nouvel enregistrement de fonds, ou en mettre à jour un (qui?) Lorsque vous n'avez pas la table Fund correctement représentée dans votre modèle objet .

Une alternative serait (comme vous mentionné) pour créer une vue dans la base de données et utiliser « au lieu de déclenchement » si votre base de données prend en charge.

+0

Merci Jens. Juste pour répondre à une question que vous avez posée dans votre réponse - nous n'avons pas de catégorie de fonds parce que nous partageons nos entités avec un système existant. Je ne vais pas entrer dans les raisons, mais nous devons partager les entités. – Trumpi

+0

Pourquoi n'utilisez-vous pas votre système pour utiliser des fonds distincts et des classes fundBalance, il semble que ce soit le modèle de domaine approprié, puis créez une interface distincte pour un système hérité. De cette façon, vous resterez sain d'esprit plus tard lorsque vous construisez votre système autour de ces classes. – zappan

0

Pourquoi ne pas utiliser le modèle de façade, si vous avez besoin est une classe commune pour les deux tableaux? Map Fund et FundBalance créent normalement une nouvelle classe (non mappée) en tant qu'interface pour les deux entités. Simple et pas de "magie" impliquée.

-1

Cela devrait être fait en utilisant un soutien pour l'héritage et hiberne. Hibernate peut modéliser des familles de classes liées de plusieurs manières différentes, mais l'une est une table pour la classe de base et une autre pour chacune des sous-classes pour contenir leurs propriétés supplémentaires. Lors du chargement, toutes les colonnes sont automatiquement chargées dans la sous-classe désignée - créez donc une fausse structure d'héritage avec juste une classe et elle devrait faire exactement ce que vous décrivez.

+0

cela n'a rien à voir avec l'héritage –

0

Si vous ne devez lire, mais pas écrire dans le Fonds, vous pouvez utiliser une formule. Par exemple:

De cette façon, vous serez en mesure de travailler avec FundBalances comme d'habitude, mais pas avec les fonds

1

Vous n'avez pas besoin d'utiliser une vue pour résoudre votre problème. Vous avez juste besoin d'être spécifique sur la jointure lorsque vous effectuez le mappage sur la table FundBalance. Si je comprends bien, vous voulez que votre catégorie de fonds de placement soit plus complète et que vous ayez quelques propriétés de la table des fonds.

Essayez ceci:

<class name="FundBalance" table="FundBalance" lazy="true"> 
     <id name="Id" column="FundBalanceId" unsaved-value="0"> 
      <generator class="native"/> 
     </id> 

     <property name="FundBalance" not-null="true" length="80"/> 

     <join table="Fund"> 
      <key column="FundId"/> 
      <property name="FundName"/> 
     </join> 
</class> 

Pour votre classe d'entité FundBalance le code sera:

public class FundBalance 
{ 
     private long _Id; 
     public virtual long Id 
     { 
      get { return _Id; } 
      set { _Id = value; } 
     } 

     private decimal _FundBalance; 
     public virtual decimal FundBalance 
     { 
      get { return _FundBalance; } 
      set { _FundBalance= value; } 
     } 

     private string _FundName; 
     public virtual string FundName 
     { 
      get { return _FundName; } 
      set { _FundName= value; } 
     } 
} 

Si vous avez besoin de plus échantillon et expliquer les problèmes de table de mappage mutiple pour un enties essayer cette liens:

https://svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate/src/NHibernate.Test/Join/ http://ayende.com/Blog/archive/2007/04/24/Multi-Table-Entities-in-NHibernate.aspx

Je vous donne les fichiers mappés HBM, pour la nhibernation fluide, je ne sais pas si vous pouvez utiliser les mots-clés JOIN mais bassicly c'est le même problème.

Espérons que cela aide.