IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

quels outils pour le mapping O/R ?


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut quels outils pour le mapping O/R ?
    Bonjour,

    Je suis actuellement à la recherche d'un outils permettant de persister mes objets en base de données. J'ai vu que linq permettait cela, mais je trouve la méthode pas très souple. J'ai vu qu'il existe aussi d'autres outils comme NHibernate ou Genome. Qu'en pensez-vous ? Lequel est le meilleur et le plus facile à manier ?
    Je veux avant tout coder mes classe sans contrainte pour les faire persister. Avec linq j'ai été déçu à cause de cela. Il me semble qu'il faut avoir un constructeur par défaut, une propriété qui soit liée à la clé de la table correspondante. De plus je n'ai pas l'impression qu'on ne puisse lier une table fille à une propriété-liste (il faut forcément créer un objet qui hérite de liste et qui soit lié à un table de la base de données). Enfin Je n'ai pas trouvé comment faire un cast entre les types de la base de donnée et les types des propriétés.

    merci d'avance pour vos conseils.

    mathmax

  2. #2
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Par défaut
    A mon avis, la solution 0 contrainte n'existe pas; ou pour être plus exact, je ne la connais pas.
    Tu peux toujours essayer NHibernate :
    http://www.nhibernate.org Opensource et assez facile

    Seulement même dans NHiberate, on a besoin d'un constructeur par défaut (fût-il privé) pour la création en interne des classes par reflexion...

    En utilisant les Nhibernate.Mapping.Attributes, tu décides quel propriété joue quel rôle : clé, relation 1-*, etc.

    Par contre, pas besoin de se soucier du casting La dernière version supporte les Generiques

    Tu peux aussi tester EasyObject, mais je ne peux pas t'en dire autant que sur NHibernate parce que je n'ai pas eu à le tester pendant longtemps

  3. #3
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    J'ai testé nhibernate. C'est pas mal du tout. Est-ce le meilleur/le plus utilisé ?

    Une petite chose que j'aimerais, c'est pouvoir utiliser des requêtes linq plutôt que leur système de requête avec des string. Sais-tu si c'est possible ?

    Une autre chose que je ne maîtrise pas trop, et peut-être pourrais-tu m'aider :
    J'ai deux classes Product et CategoryOfProduct qui hérite d'une même classe abstraite "Item". Coté base de données, j'ai seulement 2 tables : une pour Product et une pour CategoryOfProduct avec certains champs identiques (comme la cétogorie parent et le nom). J'aimerais mapper les classes Product et CategoryOfProduct à chacune de ces 2 tables, mais mapper les champs communs à la classe Item.

    D'après ce que j'ai lu dans la documentation de nhibernate, je pense qu'il faut utiliser la stratégie table per concrete class, mais j'ai quelques soucis avec l'écriture du fichier de mapping... Voici par exemple ce que j'ai écrit pour la classe produit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <class name="Product" table="Products">
      <id name="Id">
        <column name="Id" sql-type="char(32)" not-null="true"/>
        <generator class="uuid.hex" />
      </id>
      <any name="CategoryOfProduct " meta-type="class" id-type="Int64">
        <column name="Id"/>
        <column name="Name" />
        <column name="ParentCategory"/>
      </any>
      <property name="Origin" />
      ...
    </class>

    Ce que j'ai écrit est visiblement incorrect, mais je ne vois pas trop comment et où placer la balise any, ni vraiment ce qu'il faut mettre à l'intérieur... Pourrais-tu me donner un coup de pouce ?

    Merci pour ton aide.

    mathmax

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 700
    Par défaut
    Si tu utilises nHibernate, essayes Acceleo (meme si je n'ai pas testé) : tu pars d'un modele UML, tu l'exportes en xmi, et Acceleo te génères le code du fichier mapping pour nHibernate.

    Perso, j'utilise EUSS qui permet de tout générer a partir de l'UML et du xmi : EUSS te genere tout grace au xmi.
    (Bon maintenant on peux faire ca aussi avec Acceleo)
    Le GROS soucis d'EUSS est qu'il n'est pas encore en version final 1.0 : ils sont à la 0931, et les mise a jour commencent a se faire rare.
    De ce fait, si tu as un héritage dans ton uml, ca va m...
    Pour le résoudre, il est préférable d'utiliser la 092, et en stratégie de mapping, une seule table pour toute la hiérarchie...


    Au final je te conseil donc le duo nHibernate + Acceleo

  5. #5
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Par défaut
    J'ai testé nhibernate. C'est pas mal du tout. Est-ce le meilleur/le plus utilisé ?
    A mon avis, Oui. Cà a commencé à prendre plus d'importance quand Hibernate s'en est mélé...

    Une petite chose que j'aimerais, c'est pouvoir utiliser des requêtes linq plutôt que leur système de requête avec des string. Sais-tu si c'est possible ?
    Linq pour NHibernate est en cours d'implémentation. Fais une recherche avec Google (j'ai pas le lien sur place)

    D'après ce que j'ai lu dans la documentation de nhibernate, je pense qu'il faut utiliser la stratégie table per concrete class,
    C'est ce que j'utilise d'habitude

    mais j'ai quelques soucis avec l'écriture du fichier de mapping
    As-tu essayé d'utiliser les NHibernate.Mapping.Attributes ?
    Perso, je ne me suis pas trouvé dans une situation où écrire le fichier hbm à la main soit nécessaire donc je passe toujours pas les attributs

  6. #6
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    Merci pour tes réponses

    As-tu essayé d'utiliser les NHibernate.Mapping.Attributes ?
    Oui mais j'aime bien les fichier de mapping (sauf comme en ce moment, ça ne marche pas... )

    Saurais-tu me dire ce qui ne va pas dans mon fichier de mapping, pour faire une stratégie table per concrete class ? Ou me donner un exemple, parce que je ne vois pas trop comment faire.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Octobre 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 8
    Par défaut Acceleo++
    Je plussoie pour Acceleo, en plus de générer le mapping NHibernate Acceleo peut génèrer les objets métiers correspondant, les DAO, en bref tout ce qu'il faut pour avoir une bonne architecture.

    Tu peux regarder la démo flash du module .Net pour te faire un avis :

    http://www.acceleo.org/pages/module-uml-vers-csharp/fr

  8. #8
    maa
    maa est déconnecté
    Membre éclairé
    Avatar de maa
    Inscrit en
    Octobre 2005
    Messages
    672
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2005
    Messages : 672
    Par défaut
    Merci pour la démo flash.
    J'avoue qu'à première vu, ça ne me tente pas trop. Je n'ai pas envie de générer automatiquement mes objets. Je préfère garder le contrôle complet sur la façon dont ils sont faits. A moins que ce module permette de définir des options très poussées pour au final obtenir exactement la structure objet que l'on souhaite... ?

  9. #9
    Expert confirmé
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Par défaut
    J'ai jamais trop eut le temps de me pencher sur NHibernate.

    Si le concept me plait bien, j'ai de grosses craintes concernant les performances... vous avez quelques retourd d'expérience sur le sujet ?

  10. #10
    mow
    mow est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 210
    Par défaut
    Voilà un exemple de fichier avec annotations NHibernate

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
     
    [NHibernate.Mapping.Attributes.Class(Table = "GF__UTILISATEUR")]
    public class Utilisateur
    {
        private int m_Id;
        private string m_Login;
        private string m_MotPasse;
        private string m_Mail;
        private Departement m_Departement;
        private IList<Profil> m_RoleCollection;
     
        public Utilisateur()
        {
            this.Login = "";
            this.MotPasse = "";
            this.Mail = "";
            this.Departement = null;
            this.RoleCollection = null;
        }
     
        public Utilisateur(string pLogin, string pMotPasse, string pNom, string pPrenom, string pMatricule, string pMail, bool pAlerte, string pPopulation)
        {
            this.Login = pLogin;
            this.MotPasse = pMotPasse;
            this.Mail = pMail;
        }
     
        [NHibernate.Mapping.Attributes.Id(Name = "Id", Column = "ID_UTILISATEUR")]
        [NHibernate.Mapping.Attributes.Generator(1, Class = "native")]
        public int Id
        {
            get
            {
                return (m_Id);
            }
            set
            {
                m_Id = value;
            }
        }
     
        [NHibernate.Mapping.Attributes.Property(Column = "LOGIN")]
        public string Login
        {
            get
            {
                return (m_Login);
            }
            set
            {
                m_Login = value;
            }
        }
     
        [NHibernate.Mapping.Attributes.Property(Column = "MOT_PASSE")]
        public string MotPasse
        {
            get
            {
                return (m_MotPasse);
            }
            set
            {
                m_MotPasse = value;
            }
        }
     
        [NHibernate.Mapping.Attributes.Property(Column = "MAIL")]
        public string Mail
        {
            get
            {
                return (m_Mail);
            }
            set
            {
                m_Mail = value;
            }
        }
     
        [NHibernate.Mapping.Attributes.ManyToOne(1, Name = "Departement", ClassType = typeof(Departement), Column = "PTR_DEPARTEMENT")]
        public Departement Departement
        {
            get
            {
                return (m_Departement);
            }
            set
            {
                m_Departement = value;
            }
        }
     
        [NHibernate.Mapping.Attributes.Bag(1, Name = "ListeRole", Inverse = true, Lazy = false, Cascade = NHibernate.Mapping.Attributes.CascadeStyle.AllDeleteOrphan)]
        [NHibernate.Mapping.Attributes.Key(2, Column = "PTR_UTILISATEUR")]
        [NHibernate.Mapping.Attributes.OneToMany(3, ClassType = typeof(Profil))]
        public IList<Profil> ListeRole
        {
            get
            {
                return (m_RoleCollection);
            }
            set
            {
                m_RoleCollection = value;
            }
        }
     
        public override string ToString()
        {
            string l_Message;
     
            l_Message = "";
            l_Message += "UTILISATEUR [(ID, " + Id.ToString() + "), (LOGIN, " + Login + "), (MAIL, " + Mail + "), (DEPARTEMENT, " + Departement.ToString() + ")]";
            return (l_Message);
            //return base.ToString();
        }
     
    }

    Mow

  11. #11
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Par défaut
    Citation Envoyé par neo.51
    Si le concept me plait bien, j'ai de grosses craintes concernant les performances... vous avez quelques retourd d'expérience sur le sujet ?
    Je n'ai pas encore eu l'occasion de tester sur un "gros" projet mais ils (et je dis bien Ils ) disent que le coût en performance n'est pas si terrible. JE crois qu'il y'a un gars qui s'est fait un benchmarck (c'est bien cà non ?) si je retrouve, je poste l'adresse

Discussions similaires

  1. Quels outils pour dvper une appli de gestion Full Web ?
    Par Neva dans le forum Général Conception Web
    Réponses: 8
    Dernier message: 18/03/2005, 18h56
  2. Quel outil pour diagrame UML pour Java ?
    Par yup dans le forum Outils
    Réponses: 5
    Dernier message: 27/08/2004, 16h24
  3. [Revue de code] Quels outils pour de grosses applis?
    Par franckR dans le forum Choisir un environnement de développement
    Réponses: 1
    Dernier message: 21/03/2004, 10h03
  4. Quel Outil pour les applis Industrielles ET bases de données
    Par ThierryAIM dans le forum Débats sur le développement - Le Best Of
    Réponses: 8
    Dernier message: 23/04/2003, 09h14
  5. Quel outil pour du développement Client/Serveur (Win XP) ?
    Par jey_bonnet dans le forum Débats sur le développement - Le Best Of
    Réponses: 5
    Dernier message: 02/11/2002, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo