Salut,
Peut-on, en utilisant le designer LINQ to SQL, modéliser des "self-associations" (je vois pas trop comment le dire en français...) ? Autrement dit, une ligne d'une table pointe vers N autres lignes de la même table ?
Au niveau data-model, c'est assez simple, il suffit de créer une table d'association, malheureusement LINQ ne modélise pas l'association comme je voudrais. Ce sera plus clair avec un exemple concret:
J'ai créé une petite base de données sous SQL Server, avec le schéma suivant:
Une ligne de user pointe vers N autres lignes de user via la table contact_list.
J'ai ensuite créé la DAL avec le designer LINQ, cela donne le schéma suivant:
Le designer me génère une propriété pour l'association User->ContactList, malheureusement (et c'est logique en fait) cette propriété n'est pas de type EntitySet<User>, mais de type EntitySet<ContactList>... ce qui fait que c'est beaucoup moins pratique à manipuler !
La classe ContactList ne correspond à rien de concret, elle a juste un rôle technique pour réaliser l'association, donc j'aimerais mieux ne pas avoir à m'en servir dans le code.
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 [Association(Name="user_contact_list1", Storage="_Contacts", ThisKey="Id", OtherKey="UserId")] public EntitySet<ContactList> Contacts { get { return this._Contacts; } set { this._Contacts.Assign(value); } }
Y a-t-il a une manière de modéliser ça correctement, si possible en utilisant le designer ?
J'ai bien une idée pour le faire à la main, mais ça me semble pas idéal... comme je ne peux pas modifier le code auto-généré (la regénération écrasera mes modifs), je pensais créer une autre partie de la classe (elle est déclarée partial) dans un autre fichier, pour ajouter une propriété permettant d'accéder directement aux users de la contact list:
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public partial class User { public EntitySet<User> TheContacts { get { EntitySet<User> contacts = (from ContactList cl in this.Contacts select cl.Contact) as EntitySet<User>; return contacts; } } }
En attendant mieux, je vais faire comme ça, mais si vous avez mieux je suis preneur !
Je sais pas si j'ai été très clair, donc n'hésitez pas à poser des questions.
Merci !
Partager