mardi 20 avril 2010

Clé composite, mapping et class avec Nhibernate

Il vous est peut etre déja arrivé d'essayer de mapper une table qui ne contient aucune clé primaire (ou alors qui est composé). Pour ma part, hier cela m'est arrivé !
C'est ce que je vais essayer de décrire dans les étapes suivantes.

Lors de l'execution et du mapping de NHibernate, logiquement (sans mettre de clé primaire dans votre fichier xml), vous devriez tomber sur ce message :
- “composite-id class must override Equals()”
- “composite-id class must override GetHashCode()”

Pour corriger cette erreur, il faut absoluement avoir une clé primaire. Dans notre cas, elle sera composée (de Contrat_ID et Code_Agn).

Voici notre mapping:

















Notre classe :
public class Allegement
{
    public virtual string Contrat_ID { get; set;}
    public virtual string Lot_Paie { get; set;}
    public virtual string Montant_ALLGT_1 { get; set;}
    public virtual string Code_Agn { get; set; }

    // nécessaire lors des clés composites
    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        Allegement a = obj as Allegement;
        if (a == null)
            return false;

        if (this.Contrat_ID == a.Contrat_ID && this.Code_Agn == a.Code_Agn)
            return true;
        else
            return false;
    }

    // necessaire lors des clés composites
    public override int GetHashCode()
    {
        int hash = 666; // ce que l'on veux 
        hash += (null == this.Contrat_ID ? 0 : this.Contrat_ID.GetHashCode());
        hash += (null == this.Code_Agn ? 0 : this.Code_Agn.GetHashCode());

        return hash;
    }
}}

Les élements a retenir de cet exemple sont :
- pas de mapping sans clé primaire
- la redefinition des méthodes "Equals" et "GetHashCode", des classes de bases

Pour plus d'information sur le mapping : http://nhforge.org/doc/nh/en/index.html dans la partie "5. Basic O/R Mapping"

Aucun commentaire:

Enregistrer un commentaire