Donc chaque Person
a zéro ou plus Clubs
et chaque Club
a zéro ou plus Persons
. Comme vous l'avez dit correctement, il s'agit d'une relation many-to-many appropriée.
Vous savez probablement qu'une base de données relationnelle a besoin d'une table supplémentaire pour mettre en œuvre cette relation entre plusieurs personnes. L'avantage de l'entity framework est qu'il reconnaît cette relation et crée cette table supplémentaire pour vous.
À première vue, le fait que cette table supplémentaire ne soit pas une dbSet
en su DbContext
: " Comment effectuer une jointure avec cette table supplémentaire si je n'ai pas de DbSet
pour cela ?".
Heureusement, vous n'avez pas besoin de mentionner cette table supplémentaire dans vos requêtes.
Si vous avez besoin d'une requête du type "Donnez-moi tous les 'Clubs' qui ... de chaque 'Personne' qui ...", ne pensez pas en termes de jointures. Utilisez plutôt les ICollections !
Obtenez toutes les personnes "John Doe" avec tous les Country clubs qu'ils fréquentent :
var result = myDbContext.Persons
.Where(person => person.Name == "John Doe")
.Select(person => new
{
PersonId = person.Id,
PersonName = person.Name,
AttendedCountryClubs = person.Clubs
.Where(club => club.Type = ClubType.CountryClub),
};
Entity Framework reconnaîtra qu'une jointure avec la table supplémentaire many-to-many est nécessaire, et effectuera cette jointure, sans que vous mentionniez cette table supplémentaire.
Dans l'autre sens : Obtenez tous les country clubs avec leurs personnes "John Doe" :
var result = myDbContext.Clubs
.Where(club => club.Type = ClubType.CountryClub)
.Select(club => new
{
ClubId = club.Id,
ClubName = club.Name,
AnonymousMembers = club.Persons
.Where(person => person.Name == "John Doe"),
}
J'ai fait l'expérience qu'une fois que j'ai commencé à penser aux collections résultantes que je veux au lieu des jointures dont j'avais besoin pour obtenir ces collections, je me suis rendu compte que j'utilisais à peine les jointures. C'est le cas pour les relations un-à-plusieurs ainsi que pour les relations plusieurs-à-plusieurs. Entity Framework utilisera en interne les jointures appropriées.