Question

J'ai une question à laquelle je suis peut-être trop en train de penser, mais voici ...

J'ai 2 classes utilisateurs et groupes. Les utilisateurs et les groupes ont de nombreuses relations et je pensais que je voulais avoir une propriété IsAuthorized dans la table de jointure group_users (car certains groupes sont privés - les utilisateurs auront besoin d'une autorisation).

Recommanderiez-vous la création d'une classe pour la table de jointure ainsi que pour les tables d'utilisateurs et de groupes? Actuellement, mes classes ressemblent à ceci.

public class Groups
{
    public Groups()
    {
        members = new List<Person>();
    }
    ...
    public virtual IList<Person> members { get; set; }
}

public class User
{


    public User()
    {
       groups = new Groups()
    }
    ...
    public virtual IList<Groups> groups{ get; set; }

}

Mon mappage est le suivant dans les deux classes (je ne montre que celui du mappage des utilisateurs, mais ils sont très similaires):

HasManyToMany<Groups>(x => x.Groups)
.WithTableName("GroupMembers")
.WithParentKeyColumn("UserID")
.WithChildKeyColumn("GroupID")
.Cascade.SaveUpdate();

Devrais-je écrire une classe qui ressemble à ceci pour la table de jointure?

public class GroupMembers
{
    public virtual string GroupID { get; set; }
    public virtual string PersonID { get; set; }
    public virtual bool WaitingForAccept { get; set; }
}

J'aimerais vraiment pouvoir ajuster le statut de membre du groupe et j'essaie de penser à la meilleure façon de procéder.

Était-ce utile?

La solution

En général, je n'aime que créer des classes qui représentent des entités commerciales réelles. Dans ce cas, je ne pense pas que "membres du groupe" représente quelque chose de valeur dans votre code. Pour moi, l'ORM doit mapper la base de données sur vos objets métier. Cela signifie que vos classes ne doivent pas nécessairement refléter exactement la structure de la base de données.

De plus, je pense qu'en implémentant GroupMembers, vous allez vous retrouver avec des collections désagréables dans vos classes d'utilisateurs et de groupes. C'EST À DIRE. la classe de groupe aura la liste des utilisateurs ainsi qu'une liste des membres du groupe qui référencent un utilisateur et inversement pour la classe d'utilisateurs. Pour moi, ce n'est pas si propre et cela rendra plus difficile la maintenance et la propagation des modifications dans les tables.

Je suggérerais de conserver la table de jointure dans la base de données, comme vous l'avez suggéré, et d'ajouter une liste de groupes appelée waitingtoaccept dans les utilisateurs et (si cela se justifie également) d'ajouter une liste d'utilisateurs appelée waitingtoaccept dans les groupes.

Ceux-ci extrairaient ensuite leurs valeurs de votre table de jointure dans la base de données en fonction de l'indicateur waitingtoaccept.

Autres conseils

Oui, bien sûr, vous avez besoin d’une autre classe comme UserGroupBridge. Un autre effet positif est que vous pouvez modifier l'appartenance à un utilisateur et les membres d'un groupe sans charger d'objets User / Groupe potentiellement lourds dans la session NHibernate.

A bientôt.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top