So every Person
has zero or more Clubs
and every Club
has zero or more Persons
. As you stated correctly, this is a proper many-to-many relation.
You probably know that a relational database needs an extra table to implement this many-to-many relationship. The nice thing about entity framework, is that it recognizes this relationship and creates this extra table for you.
At first glance it seems a problem that this extra table is not a dbSet
in your DbContext
: "How to perform a join with this extra table if I don't have a DbSet
for it?".
Luckily, you don't need to mention this extra table in your queries.
If you need a query like "Give me all 'Clubs' that ... from every 'Person' who ..." don't think in joins. Instead use the ICollections!
Get all "John Doe" persons with all Country clubs they attend:
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 will recognize that a join with the extra many-to-many table is needed, and will perform this join, without you mentioning this extra table.
The other way round: Get all country clubs with their "John Doe" Persons:
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"),
}
I've experienced that once I started to think in the resulting collections that I want instead of the joins I needed to get these collections I found that I hardly use the joins. This is the case for one-to-many relations as well as many-to-many relations. Entity framework will internally use the proper joins.