2009-08-20 7 views
8

Ma classe a un champ de type Dictionary<string, List<string>>. Quelle est la meilleure façon de le mapper avec NHibernate? Je ferais mieux de le laisser comme un champ, je ne veux pas l'exposer.NHibernate: mappage d'un dictionnaire de listes

Merci beaucoup!

ulu

Répondre

7

Vous ne pouvez pas le mapper directement. Il y a deux règles à prendre en compte:

  • Toujours utiliser des interfaces pour les collections (par exemple IList<T>, IDictionary<K,V>.)
  • NH ne supporte pas les collections imbriquées. Je n'ai jamais vu une application pour cela avant et je n'ai jamais entendu quelqu'un le demander.

Mettez votre liste de chaînes dans une interface de classe et d'utilisation:

class StringList 
{ 
    IList<string> Strings { get; private set; } 
} 

class Entity 
{ 
    private IDictionary<string, StringList> stringDict; 
} 

Vous pourriez même voir certains avantages d'une telle classe.

Cartographie:

<class name="Entity"> 
    ... 
    <map name="stringDict" table="Entity_StringDict" access="field"> 
    <key column="Entity_FK"/> 
    <index column="Key" type="System.String"/> 
    <composite-element class="StringList"> 
     <bag name="Strings" table="Entity_StringDict_Strings"> 
     <key column="Entity_StringDict_FK"/> 
     <element type="System.String" column="String"/> 
     </bag> 
    </composite-element> 
    </map> 
</class> 

Carte à trois tableaux:

  • Tableau Entity
  • Tableau Entity_StringDict
    • Colonne Entity_FK
    • Colonne Key
  • Tableau Entity_StringDict_Strings
    • Colonne Entity_StringDict_FK
    • Colonne String
+0

fantastique, je vais donner un essai! – ulu

+1

Hmm Je reçois une erreur: Erreur de validation XML: L'élément 'composite-element' dans l'espace de noms 'urn: nhibernate-mapping-2.2' a un élément enfant invalide 'bag' dans l'espace de noms 'urn: nhibernate-mapping-2.2' . Liste des éléments possibles attendus: 'parent, propriété, plusieurs-à-un, élément-composite-imbriqué' dans l'espace-noms 'urn: nhibernate-mapping-2.2'. En utilisant Nhibernate 2.0.1 .. – ulu

+0

Aussi, les docs disent, "Les éléments composites peuvent contenir des composants mais pas des collections". – ulu

Questions connexes