NHibernate mapping de Dictionary<MyClass, string>

NHibernate mapping de Dictionary<MyClass, string> - C#/.NET managed - Programmation

Marsh Posté le 10-10-2008 à 11:55:09    

Bonjour,  
 
J'ai une classe "mon_objet" qui me sert de clef dans un dictionnaire. Cela doit me donner une chaîne de caractère en valeur. Il faut que la partie dotnet compare les références pour savoir si les clefs sont égales.
 
J'ai aucune idée de comment implémenter le mapping nhibernate avec une clef qui n'est pas un type primitif.
 
Si vous avez des idées !
 
Merci  
 
Laurent

Reply

Marsh Posté le 10-10-2008 à 11:55:09   

Reply

Marsh Posté le 13-10-2008 à 15:46:28    

C'est quoi "mon_objet" comme classe ?
En base, la clé de ta table, c'est un ensemble de champs simples ?
Si oui, regarde les "composite-id" dans la doc.

Reply

Marsh Posté le 15-10-2008 à 09:14:33    

C'est une classe de mon projet. En base, je veut qu'il mettre l'ID de l'instance de "ma classe" donc "mon objet" et je veut qu'NHibernate me donne la référence dans la partie logiciel.
 
Je sais pas si je suis clair, ca ne l'ai pas forcément dans ma tête :x

Reply

Marsh Posté le 15-10-2008 à 16:29:42    

nan, c'est pas clair ;)
Que veux-tu dire par "l'ID de l'instance de ma classe donc "mon_objet"" ?
L'objet "mon_objet " ? Si c'est le cas :
1) il faut qu'il soit sérialisable (attribut Serializable + tout ce qui dans l'objet doit l'etre aussi)
2) C'est un peu bizarre, au sens où c'est possible, mais bon, des primary key de type blob/clob (objet binaire), c'est pas super pratique ni super performant pour les requêtes.
Si vraiment ce qu'il te faut, tu pourrais faire une autre table qui aurait comme champs : ID (int), DATA (blob/clob), et ton autre objet avec comme clé cet objet coté applicatif, et un entier en base.
 
Tu peux peut etre mettre le code de ces deux classes ici, ca pourrait etre plus clair


Message édité par juflo le 15-10-2008 à 16:33:54
Reply

Marsh Posté le 16-10-2008 à 09:27:28    

Alors, j'ai deux classes :
 
namespace MonProjet.Domain
{
    public class MaClasse
    {
        public int ID { get; set; }
        public string Label { get; set; }
    }
}
 
Et :
 
namespace MonProjet.Domain
{
    public class Truc
    {
        public virtual IDictionary<MaClasse, string> MaClasseValues { get; set; }  
        [...]
    }
}
 
Les deux sont des classes métiers. En gros on pourrais voir MaClasse comme un critère de sélection et l'association MaClasse/string comme un critère de sélection avec une valeur particulière dans l'instance de Truc.
Les deux sont des classes métiers.
 
J'ai un hbm pour chaque. C'est le hbm de Truc que je n'arrive pas à faire. Je n'ai pas le droit de modifier la classe Truc pour ajouter du code dedans.
 
En base, j'imagine avoir une classe association MaClasseValues avec trois attributs, l'ID de Truc, l'ID de MaClasse et un attribut contenant la valeur de string. Dans la base je veut stocker les ID de mes objets et dans mon code les références des instances.
 
Merci pour ton aide et pour l'intérêt que tu portes à ma demande.


Message édité par FLLM le 16-10-2008 à 09:31:47
Reply

Marsh Posté le 16-10-2008 à 11:37:36    

Pour MaClasseValues  dans Truc, ca va etre qqch du genre :
 
<map name="MaClasseValues" table="Table_d_association_MaClasse_Truc">
      <key column="champ_de_Truc_dans_la_table_d_association" />
      <index column="Primarey_Key_de_la_table_de_MaCLasse" type="MonProjet.Domain.MaClasse, MonProjet"/>
      <many-to-many class="System.String" column="Champ_de_label" />
 </map>

Reply

Marsh Posté le 17-10-2008 à 09:31:34    

Voici l'incantation NHibernate pour faire le mapping d'un dictionnaire :
 
    <map name="MaClasseValues" table="MA_CLASSE_VALUES" cascade="save-update" lazy="false">
      <key column="TRUC_ID" />
      <composite-index class="MonProjet.Domain.MaClasse, MonProjet.Domain" >
        <key-property column="MA_CLASSE_ID" name="ID"/>
      </composite-index>
      <element column="VALUE" type="string" />
    </map>
 
Un grand merci à toi juflo.

Reply

Marsh Posté le 20-10-2008 à 16:35:33    

De rien ;)
(Ca commence à être tordu quand même !)
Néanmoins, je suis pas sur de l'utilité du composite-index, vu que tu n'as qu'une seule "key-property" (et pas de "key-value" non plus).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed