2 pièce(s) jointe(s)
[Linq 2 SQL] Problème de modélisation
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:
http://www.developpez.net/forums/att...1&d=1202850761
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:
http://www.developpez.net/forums/att...1&d=1202852771
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 !
Code:
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);
}
} |
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.
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:
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 !